summary refs log tree commit diff
diff options
context:
space:
mode:
authorNeil Johnson <neil@matrix.org>2019-01-29 15:58:37 +0000
committerNeil Johnson <neil@matrix.org>2019-01-29 15:58:37 +0000
commitf03b3a7a3a33df190ec9473ffc5bc4be04c58ae8 (patch)
tree5b01f26f8224771e186ca2cb4ffa37e86e7a8d81
parentisort (diff)
downloadsynapse-f03b3a7a3a33df190ec9473ffc5bc4be04c58ae8.tar.xz
support change_password in capabilities end-point
-rw-r--r--synapse/rest/client/v2_alpha/capabilities.py14
-rw-r--r--tests/rest/client/v2_alpha/test_capabilities.py23
2 files changed, 35 insertions, 2 deletions
diff --git a/synapse/rest/client/v2_alpha/capabilities.py b/synapse/rest/client/v2_alpha/capabilities.py
index 767e6c9798..08df941b5f 100644
--- a/synapse/rest/client/v2_alpha/capabilities.py
+++ b/synapse/rest/client/v2_alpha/capabilities.py
@@ -12,14 +12,20 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+import logging
+
 from twisted.internet import defer
 
 from synapse.http.servlet import RestServlet
 
 from ._base import client_v2_patterns
 
+logger = logging.getLogger(__name__)
+
 
 class CapabilitiesRestServlet(RestServlet):
+    """End point to expose the capabilities of the server."""
+
     PATTERNS = client_v2_patterns("/capabilities$")
 
     def __init__(self, hs):
@@ -30,11 +36,14 @@ class CapabilitiesRestServlet(RestServlet):
         super(CapabilitiesRestServlet, self).__init__()
         self.hs = hs
         self.auth = hs.get_auth()
+        self.store = hs.get_datastore()
 
     @defer.inlineCallbacks
     def on_GET(self, request):
+        requester = yield self.auth.get_user_by_req(request, allow_guest=True)
+        user = yield self.store.get_user_by_id(requester.user.to_string())
+        change_password = bool(user['password_hash'])
 
-        yield self.auth.get_user_by_req(request, allow_guest=True)
         defer.returnValue(
             (200, {
                 "capabilities": {
@@ -45,7 +54,8 @@ class CapabilitiesRestServlet(RestServlet):
                             "2": "stable",
                             "state-v2-test": "unstable",
                         }
-                    }
+                    },
+                    "m.change_password": change_password,
                 }
             })
         )
diff --git a/tests/rest/client/v2_alpha/test_capabilities.py b/tests/rest/client/v2_alpha/test_capabilities.py
index 131a4af417..62dbfa06b2 100644
--- a/tests/rest/client/v2_alpha/test_capabilities.py
+++ b/tests/rest/client/v2_alpha/test_capabilities.py
@@ -31,6 +31,7 @@ class CapabilitiesTestCase(unittest.HomeserverTestCase):
     def make_homeserver(self, reactor, clock):
         self.url = b"/_matrix/client/r0/capabilities"
         hs = self.setup_test_homeserver()
+        self.store = hs.get_datastore()
         return hs
 
     def test_check_auth_required(self):
@@ -53,3 +54,25 @@ class CapabilitiesTestCase(unittest.HomeserverTestCase):
         self.assertEqual(
             DEFAULT_ROOM_VERSION, capabilities['m.room_versions']['default']
         )
+
+    def test_get_change_password_capabilities(self):
+        localpart = "user"
+        password = "pass"
+        user = self.register_user(localpart, password)
+        access_token = self.login(user, password)
+
+        request, channel = self.make_request("GET", self.url, access_token=access_token)
+        self.render(request)
+        capabilities = channel.json_body['capabilities']
+
+        self.assertEqual(channel.code, 200)
+
+        # Test case where password is handled outside of Synapse
+        self.assertTrue(capabilities['m.change_password'])
+        self.get_success(self.store.user_set_password_hash(user, None))
+        request, channel = self.make_request("GET", self.url, access_token=access_token)
+        self.render(request)
+        capabilities = channel.json_body['capabilities']
+
+        self.assertEqual(channel.code, 200)
+        self.assertFalse(capabilities['m.change_password'])