Beispiel #1
0
    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))
Beispiel #2
0
    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")))
Beispiel #3
0
    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))
Beispiel #4
0
    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))
Beispiel #5
0
    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")))
Beispiel #6
0
def generate_user_code():
    return make_random_code(12)
Beispiel #7
0
def generate_user_code():
    return make_random_code(12)