Show More
@@ -1,7 +1,7 b'' | |||||
1 | .. _debugging: |
|
1 | .. _debugging: | |
2 |
|
2 | |||
3 | =================== |
|
3 | =================== | |
4 | DEBUGGING RHODECODE |
|
4 | Debugging RhodeCode | |
5 | =================== |
|
5 | =================== | |
6 |
|
6 | |||
7 | If you encountered problems with RhodeCode here are some instructions how to |
|
7 | If you encountered problems with RhodeCode here are some instructions how to | |
@@ -15,11 +15,16 b' enable detailed debug' | |||||
15 | RhodeCode uses standard python logging modules to log it's output. |
|
15 | RhodeCode uses standard python logging modules to log it's output. | |
16 | By default only loggers with INFO level are displayed. To enable full output |
|
16 | By default only loggers with INFO level are displayed. To enable full output | |
17 | change `level = DEBUG` for all logging handlers in currently used .ini file. |
|
17 | change `level = DEBUG` for all logging handlers in currently used .ini file. | |
18 | After this you can check much more detailed output of actions happening on |
|
18 | This change will allow to see much more detailed output in the logfile or | |
19 | RhodeCode system. |
|
19 | console. This generally helps a lot to track issues. | |
20 |
|
20 | |||
21 |
|
21 | |||
22 | enable interactive debug mode |
|
22 | enable interactive debug mode | |
23 | ----------------------------- |
|
23 | ----------------------------- | |
24 |
|
24 | |||
25 | To enable interactive debug mode simply |
|
25 | To enable interactive debug mode simply comment out `set debug = false` in | |
|
26 | .ini file, this will trigger and interactive debugger each time there an | |||
|
27 | error in browser, or send a http link if error occured in the backend. This | |||
|
28 | is a great tool for fast debugging as you get a handy python console right | |||
|
29 | in the web view. ** NEVER ENABLE THIS ON PRODUCTION ** the interactive console | |||
|
30 | can be a serious security threat to you system. |
@@ -521,8 +521,7 b' class PermsDecorator(object):' | |||||
521 | self.user = cls.rhodecode_user |
|
521 | self.user = cls.rhodecode_user | |
522 | self.user_perms = self.user.permissions |
|
522 | self.user_perms = self.user.permissions | |
523 | log.debug('checking %s permissions %s for %s %s', |
|
523 | log.debug('checking %s permissions %s for %s %s', | |
524 | self.__class__.__name__, self.required_perms, cls, |
|
524 | self.__class__.__name__, self.required_perms, cls, self.user) | |
525 | self.user) |
|
|||
526 |
|
525 | |||
527 | if self.check_permissions(): |
|
526 | if self.check_permissions(): | |
528 | log.debug('Permission granted for %s %s' % (cls, self.user)) |
|
527 | log.debug('Permission granted for %s %s' % (cls, self.user)) | |
@@ -604,6 +603,7 b' class HasRepoPermissionAnyDecorator(Perm' | |||||
604 | user_perms = set([self.user_perms['repositories'][repo_name]]) |
|
603 | user_perms = set([self.user_perms['repositories'][repo_name]]) | |
605 | except KeyError: |
|
604 | except KeyError: | |
606 | return False |
|
605 | return False | |
|
606 | ||||
607 | if self.required_perms.intersection(user_perms): |
|
607 | if self.required_perms.intersection(user_perms): | |
608 | return True |
|
608 | return True | |
609 | return False |
|
609 | return False | |
@@ -658,26 +658,34 b' class PermsFunction(object):' | |||||
658 | raise Exception("'%s' permission is not defined" % perm) |
|
658 | raise Exception("'%s' permission is not defined" % perm) | |
659 | self.required_perms = set(perms) |
|
659 | self.required_perms = set(perms) | |
660 | self.user_perms = None |
|
660 | self.user_perms = None | |
661 | self.granted_for = '' |
|
|||
662 | self.repo_name = None |
|
661 | self.repo_name = None | |
|
662 | self.group_name = None | |||
663 |
|
663 | |||
664 | def __call__(self, check_Location=''): |
|
664 | def __call__(self, check_Location=''): | |
665 | user = request.user |
|
665 | user = request.user | |
666 |
|
|
666 | cls_name = self.__class__.__name__ | |
667 | self.required_perms, user) |
|
667 | check_scope = { | |
|
668 | 'HasPermissionAll': '', | |||
|
669 | 'HasPermissionAny': '', | |||
|
670 | 'HasRepoPermissionAll': 'repo:%s' % self.repo_name, | |||
|
671 | 'HasRepoPermissionAny': 'repo:%s' % self.repo_name, | |||
|
672 | 'HasReposGroupPermissionAll': 'group:%s' % self.group_name, | |||
|
673 | 'HasReposGroupPermissionAny': 'group:%s' % self.group_name, | |||
|
674 | }.get(cls_name, '?') | |||
|
675 | log.debug('checking cls:%s %s usr:%s %s @ %s', cls_name, | |||
|
676 | self.required_perms, user, check_scope, | |||
|
677 | check_Location or 'unspecified location') | |||
668 | if not user: |
|
678 | if not user: | |
669 | log.debug('Empty request user') |
|
679 | log.debug('Empty request user') | |
670 | return False |
|
680 | return False | |
671 | self.user_perms = user.permissions |
|
681 | self.user_perms = user.permissions | |
672 | self.granted_for = user |
|
|||
673 |
|
||||
674 | if self.check_permissions(): |
|
682 | if self.check_permissions(): | |
675 |
log.debug('Permission granted %s @ %s', se |
|
683 | log.debug('Permission granted for user: %s @ %s', user, | |
676 | check_Location or 'unspecified location') |
|
684 | check_Location or 'unspecified location') | |
677 | return True |
|
685 | return True | |
678 |
|
686 | |||
679 | else: |
|
687 | else: | |
680 |
log.debug('Permission denied for %s @ %s', se |
|
688 | log.debug('Permission denied for user: %s @ %s', user, | |
681 | check_Location or 'unspecified location') |
|
689 | check_Location or 'unspecified location') | |
682 | return False |
|
690 | return False | |
683 |
|
691 | |||
@@ -701,7 +709,6 b' class HasPermissionAny(PermsFunction):' | |||||
701 |
|
709 | |||
702 |
|
710 | |||
703 | class HasRepoPermissionAll(PermsFunction): |
|
711 | class HasRepoPermissionAll(PermsFunction): | |
704 |
|
||||
705 | def __call__(self, repo_name=None, check_Location=''): |
|
712 | def __call__(self, repo_name=None, check_Location=''): | |
706 | self.repo_name = repo_name |
|
713 | self.repo_name = repo_name | |
707 | return super(HasRepoPermissionAll, self).__call__(check_Location) |
|
714 | return super(HasRepoPermissionAll, self).__call__(check_Location) | |
@@ -711,19 +718,17 b' class HasRepoPermissionAll(PermsFunction' | |||||
711 | self.repo_name = get_repo_slug(request) |
|
718 | self.repo_name = get_repo_slug(request) | |
712 |
|
719 | |||
713 | try: |
|
720 | try: | |
714 | self.user_perms = set( |
|
721 | self._user_perms = set( | |
715 | [self.user_perms['repositories'][self.repo_name]] |
|
722 | [self.user_perms['repositories'][self.repo_name]] | |
716 | ) |
|
723 | ) | |
717 | except KeyError: |
|
724 | except KeyError: | |
718 | return False |
|
725 | return False | |
719 | self.granted_for = self.repo_name |
|
726 | if self.required_perms.issubset(self._user_perms): | |
720 | if self.required_perms.issubset(self.user_perms): |
|
|||
721 | return True |
|
727 | return True | |
722 | return False |
|
728 | return False | |
723 |
|
729 | |||
724 |
|
730 | |||
725 | class HasRepoPermissionAny(PermsFunction): |
|
731 | class HasRepoPermissionAny(PermsFunction): | |
726 |
|
||||
727 | def __call__(self, repo_name=None, check_Location=''): |
|
732 | def __call__(self, repo_name=None, check_Location=''): | |
728 | self.repo_name = repo_name |
|
733 | self.repo_name = repo_name | |
729 | return super(HasRepoPermissionAny, self).__call__(check_Location) |
|
734 | return super(HasRepoPermissionAny, self).__call__(check_Location) | |
@@ -733,13 +738,12 b' class HasRepoPermissionAny(PermsFunction' | |||||
733 | self.repo_name = get_repo_slug(request) |
|
738 | self.repo_name = get_repo_slug(request) | |
734 |
|
739 | |||
735 | try: |
|
740 | try: | |
736 | self.user_perms = set( |
|
741 | self._user_perms = set( | |
737 | [self.user_perms['repositories'][self.repo_name]] |
|
742 | [self.user_perms['repositories'][self.repo_name]] | |
738 | ) |
|
743 | ) | |
739 | except KeyError: |
|
744 | except KeyError: | |
740 | return False |
|
745 | return False | |
741 | self.granted_for = self.repo_name |
|
746 | if self.required_perms.intersection(self._user_perms): | |
742 | if self.required_perms.intersection(self.user_perms): |
|
|||
743 | return True |
|
747 | return True | |
744 | return False |
|
748 | return False | |
745 |
|
749 | |||
@@ -751,13 +755,12 b' class HasReposGroupPermissionAny(PermsFu' | |||||
751 |
|
755 | |||
752 | def check_permissions(self): |
|
756 | def check_permissions(self): | |
753 | try: |
|
757 | try: | |
754 | self.user_perms = set( |
|
758 | self._user_perms = set( | |
755 | [self.user_perms['repositories_groups'][self.group_name]] |
|
759 | [self.user_perms['repositories_groups'][self.group_name]] | |
756 | ) |
|
760 | ) | |
757 | except KeyError: |
|
761 | except KeyError: | |
758 | return False |
|
762 | return False | |
759 | self.granted_for = self.repo_name |
|
763 | if self.required_perms.intersection(self._user_perms): | |
760 | if self.required_perms.intersection(self.user_perms): |
|
|||
761 | return True |
|
764 | return True | |
762 | return False |
|
765 | return False | |
763 |
|
766 | |||
@@ -769,13 +772,12 b' class HasReposGroupPermissionAll(PermsFu' | |||||
769 |
|
772 | |||
770 | def check_permissions(self): |
|
773 | def check_permissions(self): | |
771 | try: |
|
774 | try: | |
772 | self.user_perms = set( |
|
775 | self._user_perms = set( | |
773 | [self.user_perms['repositories_groups'][self.group_name]] |
|
776 | [self.user_perms['repositories_groups'][self.group_name]] | |
774 | ) |
|
777 | ) | |
775 | except KeyError: |
|
778 | except KeyError: | |
776 | return False |
|
779 | return False | |
777 | self.granted_for = self.repo_name |
|
780 | if self.required_perms.issubset(self._user_perms): | |
778 | if self.required_perms.issubset(self.user_perms): |
|
|||
779 | return True |
|
781 | return True | |
780 | return False |
|
782 | return False | |
781 |
|
783 | |||
@@ -798,7 +800,6 b' class HasPermissionAnyMiddleware(object)' | |||||
798 | log.error('Exception while accessing permissions %s' % |
|
800 | log.error('Exception while accessing permissions %s' % | |
799 | traceback.format_exc()) |
|
801 | traceback.format_exc()) | |
800 | self.user_perms = set() |
|
802 | self.user_perms = set() | |
801 | self.granted_for = '' |
|
|||
802 | self.username = user.username |
|
803 | self.username = user.username | |
803 | self.repo_name = repo_name |
|
804 | self.repo_name = repo_name | |
804 | return self.check_permissions() |
|
805 | return self.check_permissions() | |
@@ -808,7 +809,13 b' class HasPermissionAnyMiddleware(object)' | |||||
808 | 'permissions %s for user:%s repository:%s', self.user_perms, |
|
809 | 'permissions %s for user:%s repository:%s', self.user_perms, | |
809 | self.username, self.repo_name) |
|
810 | self.username, self.repo_name) | |
810 | if self.required_perms.intersection(self.user_perms): |
|
811 | if self.required_perms.intersection(self.user_perms): | |
811 |
log.debug('permission granted' |
|
812 | log.debug('permission granted for user:%s on repo:%s' % ( | |
|
813 | self.username, self.repo_name | |||
|
814 | ) | |||
|
815 | ) | |||
812 | return True |
|
816 | return True | |
813 |
log.debug('permission denied' |
|
817 | log.debug('permission denied for user:%s on repo:%s' % ( | |
|
818 | self.username, self.repo_name | |||
|
819 | ) | |||
|
820 | ) | |||
814 | return False |
|
821 | return False |
General Comments 0
You need to be logged in to leave comments.
Login now