0
0
Fork 1
mirror of https://mau.dev/maunium/synapse.git synced 2025-01-18 23:01:55 +01:00

make add3pid servlet work

This commit is contained in:
David Baker 2015-04-17 16:44:49 +01:00
parent 0b1a8500a2
commit f96ab9d18d
4 changed files with 81 additions and 11 deletions

View file

@ -74,3 +74,10 @@ class LoginHandler(BaseHandler):
user_id, token_id user_id, token_id
) )
yield self.store.flush_user(user_id) yield self.store.flush_user(user_id)
@defer.inlineCallbacks
def add_threepid(self, user_id, medium, address, validated_at):
yield self.store.user_add_threepid(
user_id, medium, address, validated_at,
self.hs.get_clock().time_msec()
)

View file

@ -18,6 +18,7 @@ from twisted.internet import defer
from synapse.api.constants import LoginType from synapse.api.constants import LoginType
from synapse.api.errors import LoginError, SynapseError, Codes from synapse.api.errors import LoginError, SynapseError, Codes
from synapse.http.servlet import RestServlet from synapse.http.servlet import RestServlet
from synapse.util.async import run_on_reactor
from ._base import client_v2_pattern, parse_json_dict_from_request from ._base import client_v2_pattern, parse_json_dict_from_request
@ -39,6 +40,8 @@ class PasswordRestServlet(RestServlet):
@defer.inlineCallbacks @defer.inlineCallbacks
def on_POST(self, request): def on_POST(self, request):
yield run_on_reactor()
body = parse_json_dict_from_request(request) body = parse_json_dict_from_request(request)
authed, result, params = yield self.auth_handler.check_auth([ authed, result, params = yield self.auth_handler.check_auth([
@ -78,16 +81,51 @@ class PasswordRestServlet(RestServlet):
class ThreepidRestServlet(RestServlet): class ThreepidRestServlet(RestServlet):
PATTERN = client_v2_pattern("/account/3pid") PATTERN = client_v2_pattern("/account/3pid")
def __init__(self, hs):
super(ThreepidRestServlet, self).__init__()
self.hs = hs
self.login_handler = hs.get_handlers().login_handler
self.identity_handler = hs.get_handlers().identity_handler
self.auth = hs.get_auth()
@defer.inlineCallbacks @defer.inlineCallbacks
def on_POST(self, request): def on_POST(self, request):
yield run_on_reactor()
body = parse_json_dict_from_request(request) body = parse_json_dict_from_request(request)
if 'threePidCreds' not in body: if 'threePidCreds' not in body:
raise SynapseError(400, "Missing param", Codes.MISSING_PARAM) raise SynapseError(400, "Missing param", Codes.MISSING_PARAM)
threePidCreds = body['threePidCreds']
auth_user, client = yield self.auth.get_user_by_req(request) auth_user, client = yield self.auth.get_user_by_req(request)
threepid = yield self.identity_handler.threepid_from_creds(threePidCreds)
if not threepid:
raise SynapseError(400, "Failed to auth 3pid")
for reqd in ['medium', 'address', 'validatedAt']:
if reqd not in threepid:
logger.warn("Couldn't add 3pid: invalid response from ID sevrer")
raise SynapseError(500, "Invalid response from ID Server")
yield self.login_handler.add_threepid(
auth_user.to_string(),
threepid['medium'],
threepid['address'],
threepid['validatedAt'],
)
if 'bind' in body and body['bind']:
logger.debug("Binding emails %s to %s" % (
threepid, auth_user.to_string()
))
yield self.identity_handler.bind_threepid(
threePidCreds, auth_user.to_string()
)
defer.returnValue((200, {}))
def register_servlets(hs, http_server): def register_servlets(hs, http_server):

View file

@ -50,6 +50,7 @@ class RegisterRestServlet(RestServlet):
self.auth_handler = hs.get_handlers().auth_handler self.auth_handler = hs.get_handlers().auth_handler
self.registration_handler = hs.get_handlers().registration_handler self.registration_handler = hs.get_handlers().registration_handler
self.identity_handler = hs.get_handlers().identity_handler self.identity_handler = hs.get_handlers().identity_handler
self.login_handler = hs.get_handlers().login_handler
@defer.inlineCallbacks @defer.inlineCallbacks
def on_POST(self, request): def on_POST(self, request):
@ -61,7 +62,6 @@ class RegisterRestServlet(RestServlet):
if 'username' in body: if 'username' in body:
desired_username = body['username'] desired_username = body['username']
print "username in body"
yield self.registration_handler.check_username(desired_username) yield self.registration_handler.check_username(desired_username)
is_using_shared_secret = False is_using_shared_secret = False
@ -118,6 +118,20 @@ class RegisterRestServlet(RestServlet):
password=new_password password=new_password
) )
if LoginType.EMAIL_IDENTITY in result:
threepid = result[LoginType.EMAIL_IDENTITY]
for reqd in ['medium', 'address', 'validatedAt']:
if reqd not in threepid:
logger.info("Can't add incomplete 3pid")
else:
yield self.login_handler.add_threepid(
user_id,
threepid['medium'],
threepid['address'],
threepid['validatedAt'],
)
if 'bind_email' in params and params['bind_email']: if 'bind_email' in params and params['bind_email']:
logger.info("bind_email specified: binding") logger.info("bind_email specified: binding")

View file

@ -175,3 +175,14 @@ class RegistrationStore(SQLBaseStore):
return rows[0] return rows[0]
return None return None
@defer.inlineCallbacks
def user_add_threepid(self, user_id, medium, address, validated_at, added_at):
yield self._simple_upsert("user_threepids", {
"user": user_id,
"medium": medium,
"address": address,
}, {
"validated_at": validated_at,
"added_at": added_at,
})