diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 9bfd25c86e..e1b1823cd7 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -206,6 +206,7 @@ class Auth(object):
defer.returnValue(True)
+ @defer.inlineCallbacks
def get_user_by_req(self, request):
""" Get a registered user's ID.
@@ -218,7 +219,25 @@ class Auth(object):
"""
# Can optionally look elsewhere in the request (e.g. headers)
try:
- return self.get_user_by_token(request.args["access_token"][0])
+ access_token = request.args["access_token"][0]
+ user_info = yield self.get_user_by_token(access_token)
+ user = user_info["user"]
+
+ ip_addr = self.hs.get_ip_from_request(request)
+ user_agent = request.requestHeaders.getRawHeaders(
+ "User-Agent",
+ default=[""]
+ )[0]
+ if user and access_token and ip_addr:
+ self.store.insert_client_ip(
+ user=user,
+ access_token=access_token,
+ device_id=user_info["device_id"],
+ ip=ip_addr,
+ user_agent=user_agent
+ )
+
+ defer.returnValue(user)
except KeyError:
raise AuthError(403, "Missing access token.")
@@ -227,21 +246,32 @@ class Auth(object):
""" Get a registered user's ID.
Args:
- token (str)- The access token to get the user by.
+ token (str): The access token to get the user by.
Returns:
- UserID : User ID object of the user who has that access token.
+ dict : dict that includes the user, device_id, and whether the
+ user is a server admin.
Raises:
AuthError if no user by that token exists or the token is invalid.
"""
try:
- user_id = yield self.store.get_user_by_token(token=token)
- if not user_id:
+ ret = yield self.store.get_user_by_token(token=token)
+ if not ret:
raise StoreError()
- defer.returnValue(self.hs.parse_userid(user_id))
+
+ user_info = {
+ "admin": bool(ret.get("admin", False)),
+ "device_id": ret.get("device_id"),
+ "user": self.hs.parse_userid(ret.get("name")),
+ }
+
+ defer.returnValue(user_info)
except StoreError:
raise AuthError(403, "Unrecognised access token.",
errcode=Codes.UNKNOWN_TOKEN)
+ def is_server_admin(self, user):
+ return self.store.is_server_admin(user)
+
@defer.inlineCallbacks
@log_function
def _can_send_event(self, event):
|