diff --git a/synapse/rest/client/v1/pusher.py b/synapse/rest/client/v1/pusher.py
index 9881f068c3..5c88a9ba09 100644
--- a/synapse/rest/client/v1/pusher.py
+++ b/synapse/rest/client/v1/pusher.py
@@ -27,14 +27,47 @@ logger = logging.getLogger(__name__)
class PusherRestServlet(ClientV1RestServlet):
- PATTERNS = client_path_patterns("/pushers/set$")
+ PATTERNS = client_path_patterns("/pushers(/set)?$")
def __init__(self, hs):
super(PusherRestServlet, self).__init__(hs)
self.notifier = hs.get_notifier()
@defer.inlineCallbacks
+ def on_GET(self, request):
+ if request.postpath != ["pushers"]:
+ defer.returnValue((405, {}))
+
+ requester = yield self.auth.get_user_by_req(request)
+ user = requester.user
+
+ pushers = yield self.hs.get_datastore().get_pushers_by_app_user_id(
+ user.to_string()
+ )
+
+ allowed_keys = [
+ "app_display_name",
+ "app_id",
+ "data",
+ "device_display_name",
+ "kind",
+ "lang",
+ "profile_tag",
+ "pushkey",
+ ]
+
+ for p in pushers:
+ for k, v in p.items():
+ if k not in allowed_keys:
+ del p[k]
+
+ defer.returnValue((200, {"pushers": pushers}))
+
+ @defer.inlineCallbacks
def on_POST(self, request):
+ if request.postpath != ["pushers", "set"]:
+ defer.returnValue((405, {}))
+
requester = yield self.auth.get_user_by_req(request)
user = requester.user
diff --git a/synapse/storage/pusher.py b/synapse/storage/pusher.py
index 19888a8e76..11feab72de 100644
--- a/synapse/storage/pusher.py
+++ b/synapse/storage/pusher.py
@@ -76,6 +76,25 @@ class PusherStore(SQLBaseStore):
defer.returnValue(rows)
@defer.inlineCallbacks
+ def get_pushers_by_app_user_id(self, user_id):
+ def r(txn):
+ sql = (
+ "SELECT * FROM pushers"
+ " WHERE user_name = ?"
+ )
+
+ txn.execute(sql, (user_id,))
+ rows = self.cursor_to_dict(txn)
+
+ return self._decode_pushers_rows(rows)
+
+ result = yield self.runInteraction(
+ "get_pushers_by_user_id", r
+ )
+
+ defer.returnValue(result)
+
+ @defer.inlineCallbacks
def get_all_pushers(self):
def get_pushers(txn):
txn.execute("SELECT * FROM pushers")
|