# HG changeset patch # User Marcin Kuzminski # Date 2017-02-13 12:04:48 # Node ID 0b87835b93f9b84c70d6ddffe3e62404bfefa4eb # Parent 2e20e3a4c9e39c2721a98c95b5de51a936edf7ab api-events: fix a case events were called from API and we couldn't fetch registered user. - Fixes #5210 diff --git a/rhodecode/api/__init__.py b/rhodecode/api/__init__.py --- a/rhodecode/api/__init__.py +++ b/rhodecode/api/__init__.py @@ -158,33 +158,36 @@ def request_view(request): # search not expired tokens only try: - u = User.get_by_auth_token(request.rpc_api_key) + api_user = User.get_by_auth_token(request.rpc_api_key) - if u is None: + if api_user is None: return jsonrpc_error( request, retid=request.rpc_id, message='Invalid API KEY') - if not u.active: + if not api_user.active: return jsonrpc_error( request, retid=request.rpc_id, message='Request from this user not allowed') # check if we are allowed to use this IP auth_u = AuthUser( - u.user_id, request.rpc_api_key, ip_addr=request.rpc_ip_addr) + api_user.user_id, request.rpc_api_key, ip_addr=request.rpc_ip_addr) if not auth_u.ip_allowed: return jsonrpc_error( request, retid=request.rpc_id, message='Request from IP:%s not allowed' % ( - request.rpc_ip_addr,)) + request.rpc_ip_addr,)) else: log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,)) + # register our auth-user + request.rpc_user = auth_u + # now check if token is valid for API role = UserApiKeys.ROLE_API extra_auth_tokens = [ - x.api_key for x in User.extra_valid_auth_tokens(u, role=role)] - active_tokens = [u.api_key] + extra_auth_tokens + x.api_key for x in User.extra_valid_auth_tokens(api_user, role=role)] + active_tokens = [api_user.api_key] + extra_auth_tokens log.debug('Checking if API key has proper role') if request.rpc_api_key not in active_tokens: diff --git a/rhodecode/events/base.py b/rhodecode/events/base.py --- a/rhodecode/events/base.py +++ b/rhodecode/events/base.py @@ -38,15 +38,30 @@ class RhodecodeEvent(object): self.utc_timestamp = datetime.utcnow() @property + def auth_user(self): + if not self.request: + return + + user = getattr(self.request, 'user', None) + if user: + return user + + api_user = getattr(self.request, 'rpc_user', None) + if api_user: + return api_user + + @property def actor(self): - if self.request: - return self.request.user.get_instance() + auth_user = self.auth_user + if auth_user: + return auth_user.get_instance() return SYSTEM_USER @property def actor_ip(self): - if self.request: - return self.request.user.ip_addr + auth_user = self.auth_user + if auth_user: + return auth_user.ip_addr return '' @property