summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2014-09-29 13:35:15 +0100
committerErik Johnston <erik@matrix.org>2014-09-29 13:35:15 +0100
commitf7d80930f21190355733da9ba7ab5068ce0702a8 (patch)
treecf66b7e28cfa49006c8e8ddae610f8371d2f7744
parentTrack the IP users connect with. Add an admin column to users table. (diff)
downloadsynapse-f7d80930f21190355733da9ba7ab5068ce0702a8.tar.xz
SYN-48: Track User-Agents as well as IPs for client devices.
-rw-r--r--synapse/api/auth.py11
-rw-r--r--synapse/storage/__init__.py6
-rw-r--r--synapse/storage/schema/delta/v5.sql4
-rw-r--r--synapse/storage/schema/users.sql4
4 files changed, 20 insertions, 5 deletions
diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 6f8146ec3a..739f77afd4 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -223,8 +223,17 @@ class Auth(object):
             user = yield self.get_user_by_token(access_token)
 
             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, access_token, ip_addr)
+                self.store.insert_client_ip(
+                    user,
+                    access_token,
+                    ip_addr,
+                    user_agent
+                )
 
             defer.returnValue(user)
         except KeyError:
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index d53c090a91..169a80dce4 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -294,13 +294,15 @@ class DataStore(RoomMemberStore, RoomStore,
 
         defer.returnValue(self.min_token)
 
-    def insert_client_ip(self, user, access_token, ip):
+    def insert_client_ip(self, user, access_token, ip, user_agent):
         return self._simple_insert(
             "user_ips",
             {
                 "user": user.to_string(),
                 "access_token": access_token,
-                "ip": ip
+                "ip": ip,
+                "user_agent": user_agent,
+                "last_used": int(self._clock.time()),
             }
         )
 
diff --git a/synapse/storage/schema/delta/v5.sql b/synapse/storage/schema/delta/v5.sql
index 380eec6f35..f5a667a250 100644
--- a/synapse/storage/schema/delta/v5.sql
+++ b/synapse/storage/schema/delta/v5.sql
@@ -3,7 +3,9 @@ CREATE TABLE IF NOT EXISTS user_ips (
     user TEXT NOT NULL,
     access_token TEXT NOT NULL,
     ip TEXT NOT NULL,
-    CONSTRAINT user_ip UNIQUE (user, access_token, ip) ON CONFLICT IGNORE
+    user_agent TEXT NOT NULL,
+    last_used INTEGER NOT NULL,
+    CONSTRAINT user_ip UNIQUE (user, access_token, ip, user_agent) ON CONFLICT REPLACE
 );
 
 CREATE INDEX IF NOT EXISTS user_ips_user ON user_ips(user);
diff --git a/synapse/storage/schema/users.sql b/synapse/storage/schema/users.sql
index 89eab8babe..d96dd9f075 100644
--- a/synapse/storage/schema/users.sql
+++ b/synapse/storage/schema/users.sql
@@ -35,7 +35,9 @@ CREATE TABLE IF NOT EXISTS user_ips (
     user TEXT NOT NULL,
     access_token TEXT NOT NULL,
     ip TEXT NOT NULL,
-    CONSTRAINT user_ip UNIQUE (user, access_token, ip) ON CONFLICT IGNORE
+    user_agent TEXT NOT NULL,
+    last_used INTEGER NOT NULL,
+    CONSTRAINT user_ip UNIQUE (user, access_token, ip, user_agent) ON CONFLICT REPLACE
 );
 
 CREATE INDEX IF NOT EXISTS user_ips_user ON user_ips(user);