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,17 +118,31 @@ class RegisterRestServlet(RestServlet):
password=new_password password=new_password
) )
if 'bind_email' in params and params['bind_email']: if LoginType.EMAIL_IDENTITY in result:
logger.info("bind_email specified: binding") threepid = result[LoginType.EMAIL_IDENTITY]
emailThreepid = result[LoginType.EMAIL_IDENTITY] for reqd in ['medium', 'address', 'validatedAt']:
threepidCreds = emailThreepid['threepidCreds'] if reqd not in threepid:
logger.debug("Binding emails %s to %s" % ( logger.info("Can't add incomplete 3pid")
emailThreepid, user_id else:
)) yield self.login_handler.add_threepid(
yield self.identity_handler.bind_threepid(threepidCreds, user_id) user_id,
else: threepid['medium'],
logger.info("bind_email not specified: not binding email") threepid['address'],
threepid['validatedAt'],
)
if 'bind_email' in params and params['bind_email']:
logger.info("bind_email specified: binding")
emailThreepid = result[LoginType.EMAIL_IDENTITY]
threepidCreds = emailThreepid['threepidCreds']
logger.debug("Binding emails %s to %s" % (
emailThreepid, user_id
))
yield self.identity_handler.bind_threepid(threepidCreds, user_id)
else:
logger.info("bind_email not specified: not binding email")
result = { result = {
"user_id": user_id, "user_id": user_id,

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,
})