Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

send_attempt is an int in msisdn too #462

Merged
merged 6 commits into from Nov 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/461.bugfix
@@ -0,0 +1 @@
Fix a bug introduced in Sydent 2.5.0 where requests to validate an email or phone number would fail with an HTTP 500 Internal Server Error if arguments were given as a query string or as a www-form-urlencoded body.
1 change: 0 additions & 1 deletion changelog.d/461.misc

This file was deleted.

1 change: 1 addition & 0 deletions changelog.d/462.bugfix
@@ -0,0 +1 @@
Fix a bug introduced in Sydent 2.5.0 where requests to validate an email or phone number would fail with an HTTP 500 Internal Server Error if arguments were given as a query string or as a www-form-urlencoded body.
11 changes: 10 additions & 1 deletion sydent/http/servlets/msisdnservlet.py
Expand Up @@ -58,7 +58,16 @@ async def render_POST(self, request: Request) -> JsonDict:

raw_phone_number = args["phone_number"]
country = args["country"]
sendAttempt = args["send_attempt"]
try:
# See the comment handling `send_attempt` in emailservlet.py for
# more context.
sendAttempt = int(args["send_attempt"])
except (TypeError, ValueError):
request.setResponseCode(400)
return {
"errcode": "M_INVALID_PARAM",
"error": f"send_attempt should be an integer (got {args['send_attempt']}",
}
clientSecret = args["client_secret"]

if not is_valid_client_secret(clientSecret):
Expand Down
78 changes: 78 additions & 0 deletions tests/test_msisdn.py
@@ -0,0 +1,78 @@
# Copyright 2021 The Matrix.org Foundation C.I.C.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# 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 asyncio
import os.path
from typing import Awaitable
from unittest.mock import MagicMock, patch

from twisted.trial import unittest
from twisted.web.server import Request

from tests.utils import make_request, make_sydent


class TestRequestCode(unittest.TestCase):
def setUp(self) -> None:
# Create a new sydent
config = {
"general": {
"templates.path": os.path.join(
os.path.dirname(os.path.dirname(__file__)), "res"
),
},
}
self.sydent = make_sydent(test_config=config)

def _render_request(self, request: Request) -> Awaitable[MagicMock]:
# Patch out the email sending so we can investigate the resulting email.
with patch("sydent.sms.openmarket.OpenMarketSMS.sendTextSMS") as sendTextSMS:
# We can't use AsyncMock until Python 3.8. Instead, mock the
# function as returning a future.
f = asyncio.Future()
f.set_result(MagicMock())
sendTextSMS.return_value = f
request.render(self.sydent.servlets.msisdnRequestCode)

return sendTextSMS

def test_request_code(self) -> None:
self.sydent.run()

request, channel = make_request(
self.sydent.reactor,
"POST",
"/_matrix/identity/api/v1/validate/msisdn/requestToken",
{
"phone_number": "447700900750",
"country": "GB",
"client_secret": "oursecret",
"send_attempt": 0,
},
)
sendSMS_mock = self._render_request(request)
sendSMS_mock.assert_called_once()
self.assertEqual(channel.code, 200)

def test_request_code_via_url_query_params(self) -> None:
self.sydent.run()
url = (
"/_matrix/identity/api/v1/validate/msisdn/requestToken?"
"phone_number=447700900750"
"&country=GB"
"&client_secret=oursecret"
"&send_attempt=0"
)
request, channel = make_request(self.sydent.reactor, "POST", url)
sendSMS_mock = self._render_request(request)
sendSMS_mock.assert_called_once()
self.assertEqual(channel.code, 200)