1818import json
1919
2020from twisted .python .filepath import FilePath
21- from twisted .web .http import OK , INTERNAL_SERVER_ERROR , BAD_REQUEST
21+ from twisted .web .http import OK , INTERNAL_SERVER_ERROR , BAD_REQUEST , UNAUTHORIZED
2222from twisted .web .template import Element , XMLFile , renderElement
2323from twisted .web .server import NOT_DONE_YET
2424from twisted .internet import defer
2525from twisted .logger import Logger
26+ from twisted .cred .error import UnauthorizedLogin
2627
2728from pixelated .resources import BaseResource
2829from pixelated .resources import get_public_static_folder
30+ from pixelated .account_recovery_authenticator import AccountRecoveryAuthenticator
2931
3032log = Logger ()
3133
@@ -49,8 +51,9 @@ class AccountRecoveryResource(BaseResource):
4951 BASE_URL = 'account-recovery'
5052 isLeaf = True
5153
52- def __init__ (self , services_factory ):
54+ def __init__ (self , services_factory , provider ):
5355 BaseResource .__init__ (self , services_factory )
56+ self ._authenticator = AccountRecoveryAuthenticator (provider )
5457
5558 def render_GET (self , request ):
5659 request .setResponseCode (OK )
@@ -69,6 +72,8 @@ def error_response(failure):
6972 log .warn (failure )
7073 if failure .type is InvalidPasswordError or failure .type is EmptyFieldsError :
7174 request .setResponseCode (BAD_REQUEST )
75+ elif failure .type is UnauthorizedLogin :
76+ request .setResponseCode (UNAUTHORIZED )
7277 else :
7378 request .setResponseCode (INTERNAL_SERVER_ERROR )
7479 request .finish ()
@@ -80,20 +85,24 @@ def error_response(failure):
8085 def _get_post_form (self , request ):
8186 return json .loads (request .content .getvalue ())
8287
88+ def _validate_empty_fields (self , username , user_code ):
89+ if not username or not user_code :
90+ raise EmptyFieldsError ('The user entered an empty username or empty usercode' )
91+
8392 def _validate_password (self , password , confirm_password ):
84- return password == confirm_password and len (password ) >= 8 and len (password ) <= 9999
93+ if password != confirm_password or len (password ) < 8 or len (password ) > 9999 :
94+ raise InvalidPasswordError ('The user entered an invalid password or confirmation' )
8595
96+ @defer .inlineCallbacks
8697 def _handle_post (self , request ):
8798 form = self ._get_post_form (request )
99+ username = form .get ('username' )
100+ user_code = form .get ('userCode' )
88101 password = form .get ('password' )
89102 confirm_password = form .get ('confirmPassword' )
90103
91- if not self ._validate_password (password , confirm_password ):
92- return defer .fail (InvalidPasswordError ('The user entered an invalid password or confirmation' ))
93-
94- username = form .get ('username' )
95- user_code = form .get ('userCode' )
96- if not username or not user_code :
97- return defer .fail (EmptyFieldsError ('The user entered an empty username or empty usercode' ))
104+ self ._validate_empty_fields (username , user_code )
105+ self ._validate_password (password , confirm_password )
98106
99- return defer .succeed ('Done!' )
107+ user_auth = yield self ._authenticator .authenticate (username , user_code )
108+ defer .returnValue (user_auth )
0 commit comments