def user_form_submitted_successfully(self, user): username = self.uform.data['username'] mailer = get_mailer(self.req) user.generated_code = make_random_code(12) user.generated_code_time_stamp = datetime.utcnow() settings = self.settings # only generate the url if it's being used url = '' if "{url}" in settings['body']: salt = settings.get('salt', 's4lt!necracker') urlparts = list(urlparse(self.req.url)) querystr = dict(parse_qsl(urlparts[4])) querystr['code'] = hashlib.sha256( "%s%s%s"%(user.id, user.generated_code, salt)) \ .hexdigest() querystr['u'] = username querystr['rem'] = settings.get('url_remember', '0') querystr['rem'] = '1' if querystr['rem'] == 'True' else '0' urlparts[4] = urlencode(querystr) url = urlunparse(urlparts) message = { 'recipients': [username], 'body': settings['body'].replace('{code}', user.generated_code) \ .replace('{url}', url), 'subject': settings['subject'], 'sender': settings['sender'] } mailer.send_immediately(Message(**message))
def user_form_submitted_successfully(self, user): # grab configuration sms_msg_tmpl = self.req.registry.settings.get( "sms.msg_tmpl", "Factored: your security code is {code}. Please don't reply.") plivo_auth_id = self.req.registry.settings.get("sms.plivo_auth_id", None) plivo_auth_token = self.req.registry.settings.get("sms.plivo_auth_token", None) plivo_phone_number = self.req.registry.settings.get("sms.plivo_phone_number", None) if not plivo_auth_id or not plivo_auth_token or not plivo_phone_number: import pdb; pdb.set_trace() logger.error("plivo not completely configured, check sms.plivo_* settings") raise HTTPInternalServerError() if "{code}" not in sms_msg_tmpl: logger.error("sms.msg_tmpl is not configured with a {code} variable") raise HTTPInternalServerError() # generate code for this request user.generated_code = make_random_code(6) user.generated_code_time_stamp = datetime.utcnow() self.db.save(self.req, user) # prepare phone numbers ## only digits, and there needs to be 11 of them (country, area, phone) src_number = ''.join([d for d in plivo_phone_number if d in string.digits]) dest_number = ''.join([d for d in user.phone if d in string.digits]) if len(src_number) != 11: logger.error("plivo number is incomplete: must include country " "code, area code, and phone number -- 11 digits in total." "This is the number configured: {}".format(src_number)) raise HTTPInternalServerError() if len(dest_number) != 11: logger.error("user phone number is incomplete: must include country " "code, area code, and phone number -- 11 digits in total." "This is the number received: {}".format(dest_number)) raise HTTPInternalServerError() # call out to plivo to send message plivo_endpoint = "https://api.plivo.com/v1/Account/{}/Message/".format(plivo_auth_id) payload = dict( src=src_number, dst=dest_number, text=sms_msg_tmpl.format(code=user.generated_code) ) response = requests.post(plivo_endpoint, json=payload, auth=(plivo_auth_id, plivo_auth_token)) # handle/log the result if response.status_code != 202: logger.error("problem sending sms:") try: logger.error(response.json()) except: logger.error(response.text) raise HTTPInternalServerError() else: rjson = response.json() logger.info("User '{}' sent msg to '{}'. plivo msg uuid is '{}'".format( user.username, dest_number, rjson.get("message_uuid", "unknown")))
def user_form_submitted_successfully(self, user): username = self.uform.data['username'] mailer = self.req.registry['mailer'] user.generated_code = make_random_code(12) user.generated_code_time_stamp = datetime.utcnow() message = self.message_settings.copy() message['recipients'] = [username] message['body'] = message['body'].replace('{code}', user.generated_code) mailer.send(Message(**message))
def user_form_submitted_successfully(self, user): username = self.uform.data['username'] mailer = get_mailer(self.req) user.generated_code = make_random_code(12) user.generated_code_time_stamp = datetime.utcnow() # save it self.db.save(self.req, user) settings = self.settings # only generate the url if it's being used url = '' if "{url}" in settings['body']: salt = settings.get('salt', 's4lt!necracker') urlparts = list(urlparse(self.req.url)) querystr = dict(parse_qsl(urlparts[4])) querystr['code'] = hashlib.sha256( "%s%s%s" % (user.id, user.generated_code, salt)) \ .hexdigest() querystr['u'] = username querystr['rem'] = settings.get('url_remember', '0') querystr['rem'] = '1' if querystr['rem'] == 'True' else '0' url = generate_url(self.req, self.req.path, querystr) message = { 'recipients': [username], 'body': settings['body'].replace('{code}', user.generated_code).replace( '{url}', url), 'subject': settings['subject'], 'sender': settings['sender'], 'extra_headers': { 'Message-ID': create_message_id() } } mailer.send_immediately(Message(**message))
def user_form_submitted_successfully(self, user): # grab configuration sms_msg_tmpl = self.req.registry.settings.get( "sms.msg_tmpl", "Factored: your security code is {code}. Please don't reply.") plivo_auth_id = self.req.registry.settings.get("sms.plivo_auth_id", None) plivo_auth_token = self.req.registry.settings.get( "sms.plivo_auth_token", None) plivo_phone_number = self.req.registry.settings.get( "sms.plivo_phone_number", None) if not plivo_auth_id or not plivo_auth_token or not plivo_phone_number: import pdb pdb.set_trace() logger.error( "plivo not completely configured, check sms.plivo_* settings") raise HTTPInternalServerError() if "{code}" not in sms_msg_tmpl: logger.error( "sms.msg_tmpl is not configured with a {code} variable") raise HTTPInternalServerError() # generate code for this request user.generated_code = make_random_code(6) user.generated_code_time_stamp = datetime.utcnow() self.db.save(self.req, user) # prepare phone numbers ## only digits, and there needs to be 11 of them (country, area, phone) src_number = ''.join( [d for d in plivo_phone_number if d in string.digits]) dest_number = ''.join([d for d in user.phone if d in string.digits]) if len(src_number) != 11: logger.error( "plivo number is incomplete: must include country " "code, area code, and phone number -- 11 digits in total." "This is the number configured: {}".format(src_number)) raise HTTPInternalServerError() if len(dest_number) != 11: logger.error( "user phone number is incomplete: must include country " "code, area code, and phone number -- 11 digits in total." "This is the number received: {}".format(dest_number)) raise HTTPInternalServerError() # call out to plivo to send message plivo_endpoint = "https://api.plivo.com/v1/Account/{}/Message/".format( plivo_auth_id) payload = dict(src=src_number, dst=dest_number, text=sms_msg_tmpl.format(code=user.generated_code)) response = requests.post(plivo_endpoint, json=payload, auth=(plivo_auth_id, plivo_auth_token)) # handle/log the result if response.status_code != 202: logger.error("problem sending sms:") try: logger.error(response.json()) except: logger.error(response.text) raise HTTPInternalServerError() else: rjson = response.json() logger.info( "User '{}' sent msg to '{}'. plivo msg uuid is '{}'".format( user.username, dest_number, rjson.get("message_uuid", "unknown")))
def generate_user_code(): return make_random_code(12)
def generate_user_code(): return make_random_code(12)