api-events: fix a case events were called from API and we couldn't fetch registered user.

- Fixes #5210
This commit is contained in:
Marcin Kuzminski 2017-02-13 13:04:48 +01:00
parent c29ad8fdb1
commit be8db660b1
2 changed files with 29 additions and 11 deletions

View file

@ -183,33 +183,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:

View file

@ -37,16 +37,31 @@ class RhodecodeEvent(object):
self.request = get_current_request()
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 '<no ip available>'
@property