Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Implement username availability checker #2183

Merged
merged 2 commits into from
May 4, 2017
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions synapse/rest/client/v2_alpha/register.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import hmac
from hashlib import sha1
from synapse.util.async import run_on_reactor
from synapse.util.ratelimitutils import FederationRateLimiter


# We ought to be using hmac.compare_digest() but on older pythons it doesn't
Expand Down Expand Up @@ -115,6 +116,40 @@ def on_POST(self, request):
defer.returnValue((200, ret))


class UsernameAvailabilityRestServlet(RestServlet):
PATTERNS = client_v2_patterns("/register/available")

def __init__(self, hs):
"""
Args:
hs (synapse.server.HomeServer): server
"""
super(UsernameAvailabilityRestServlet, self).__init__()
self.hs = hs
self.registration_handler = hs.get_handlers().registration_handler
self.ratelimiter = FederationRateLimiter(
hs.get_clock(),
window_size=2000, # Time window of 2s
sleep_limit=1, # Artificially delay requests if rate > sleep_limit/window_size
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True here surely?

Copy link
Contributor Author

@lukebarnard1 lukebarnard1 May 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Er, the docs say,
sleep_limit (int): The number of requests received...

sleep_msec=1000, # Amount of artificial delay to apply
reject_limit=1, # Error with 429 if more than reject_limit requests are queued
concurrent_requests=1, # Allow 1 request at a time
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True

)

@defer.inlineCallbacks
def on_GET(self, request):
ip = self.hs.get_ip_from_request(request)
with self.ratelimiter.ratelimit(ip) as wait_deferred:
yield wait_deferred

body = parse_json_object_from_request(request)
assert_params_in_request(body, ['username'])

yield self.registration_handler.check_username(body['username'])

defer.returnValue((200, {"available": True}))


class RegisterRestServlet(RestServlet):
PATTERNS = client_v2_patterns("/register$")

Expand Down Expand Up @@ -555,4 +590,5 @@ def _do_guest_registration(self, params):
def register_servlets(hs, http_server):
EmailRegisterRequestTokenRestServlet(hs).register(http_server)
MsisdnRegisterRequestTokenRestServlet(hs).register(http_server)
UsernameAvailabilityRestServlet(hs).register(http_server)
RegisterRestServlet(hs).register(http_server)