33"""
44
55import datetime
6- import uuid
76import logging
7+ import uuid
88
9+ import phonenumbers
910from flask import Blueprint , render_template , request , redirect , flash
11+ from flask import current_app
1012from flask import session as flask_session
13+ from twilio .rest import Client
1114
15+ from selfservice import db , auth , xcaptcha , ldap , version , OIDC_PROVIDER
16+ from selfservice .models import RecoverySession , PhoneVerification , ResetToken
1217from selfservice .utilities .general import email_recovery , phone_recovery
18+ from selfservice .utilities .ldap import verif_methods , get_members
1319from selfservice .utilities .reset import (
1420 generate_token ,
15- generate_pin ,
1621 passwd_reset ,
1722 TokenAlreadyExists ,
1823)
19- from selfservice .utilities .ldap import verif_methods , get_members
20-
21- from selfservice .models import RecoverySession , PhoneVerification , ResetToken
22- from selfservice import db , auth , xcaptcha , ldap , version , OIDC_PROVIDER
2324
2425LOG = logging .getLogger (__name__ )
2526
@@ -37,7 +38,6 @@ def create_session():
3738 return render_template ("recovery.html" , version = version )
3839
3940 if xcaptcha .verify ():
40-
4141 # If we can't find an account, flash error.
4242 try :
4343 member = ldap .get_member (request .form ["username" ], True )
@@ -160,8 +160,16 @@ def method_selection(recovery_id, method):
160160 return redirect ("/recovery" )
161161
162162 elif method == "phone" :
163+ formatted_phone = phonenumbers .format_number (
164+ phonenumbers .parse (methods ["phone" ][index ]["data" ], "US" ),
165+ phonenumbers .PhoneNumberFormat .E164 ,
166+ )
167+
163168 try :
164- token = generate_pin (session )
169+ # Create the object in the database.
170+ reset = PhoneVerification (session = session .id , phone_number = formatted_phone )
171+ db .session .add (reset )
172+ db .session .commit ()
165173 except TokenAlreadyExists :
166174 flash (
167175 "This session has already been used to generate a "
@@ -171,7 +179,7 @@ def method_selection(recovery_id, method):
171179 return redirect ("/recovery" )
172180
173181 try :
174- phone_recovery (phone = methods [ "phone" ][ index ][ "data" ], token = token )
182+ phone_recovery (phone = formatted_phone )
175183 return render_template (
176184 "phone.html" ,
177185 recovery_id = session .id ,
@@ -190,9 +198,18 @@ def verify_phone(recovery_id):
190198 Check the provided verification code against our stored code.
191199 """
192200 session = RecoverySession .query .filter_by (id = recovery_id ).first ()
193- token = PhoneVerification .query .filter_by (session = recovery_id ).first ()
201+ phone = PhoneVerification .query .filter_by (session = recovery_id ).first ()
202+
203+ service_sid = current_app .config .get ("TWILIO_SERVICE_SID" )
204+ client = Client (
205+ current_app .config .get ("TWILIO_SID" ), current_app .config .get ("TWILIO_TOKEN" )
206+ )
207+
208+ verification_check = client .verify .v2 .services (
209+ service_sid
210+ ).verification_checks .create (to = phone .phone_number , code = request .form ["verify" ])
194211
195- if request . form [ "verify" ] == token . code :
212+ if verification_check . status == "approved" :
196213 token = ResetToken .query .filter_by (session = recovery_id ).first ()
197214 if not token :
198215 token = generate_token (session )
0 commit comments