Пример #1
0
    def get(cls, confirmation_id: str):
        confirmation = ConfirmationModel.find_by_id(confirmation_id)
        if not confirmation:
            return make_response(
                render_template(
                    "confirmation.html",
                    server_response=response_quote("confirmation_not_found"),
                    img_file="error.png"), 404)
        if confirmation.expired:
            return make_response(
                render_template("confirmation.html",
                                server_response=response_quote(
                                    "confirmation_link_expired"),
                                img_file="error.png"), 400)
        if confirmation.confirmed:
            return make_response(
                render_template("confirmation.html",
                                server_response=response_quote(
                                    "confirmation_link_already_confirmed"),
                                img_file="error.png"), 400)

        confirmation.confirmed = True
        confirmation.save_to_db()

        headers = {"Content_Type": "text/html"}
        return make_response(
            render_template(
                'confirmation.html',
                server_response=response_quote("confirmation_link_confirmed"),
                img_file="done.png"), 200, headers)
Пример #2
0
 def send_email_2fa_code(self, code: str) -> Response:
     subject = response_quote("email2fa_code_mail_subject")
     text = response_quote("email2fa_code_mail_text")
     html = f'<html>' \
            f'{response_quote("email2fa_code_mail_text").format(EmailSecondFA.token_expiration_delta().seconds // 60)} ' \
            f'<h4>{code}</h4></html>'
     return MailGun.send_email_message([self.email], subject, text, html)
Пример #3
0
 def post(cls):
     data = request.get_json()
     if UserModel.find_by_email(data["email"]):
         return {
             "message": response_quote("user_email_taken")
         }, 400  # TODO:
     user = UserModel(username=data["username"],
                      password=b_crypt.generate_password_hash(
                          data["password"]).decode("utf-8"),
                      email=data["email"],
                      sha_private=hashlib.sha256(str.encode(
                          data["email"])).hexdigest())
     try:
         user.save_to_db()
         confirmation = ConfirmationModel(user.id)
         confirmation.save_to_db()
         user.confirm()
         return {"message": response_quote("user_been_created")}, 201
     except MailGunException as e:
         user.delete_from_db()  # rollback
         return {"message": str(e)}, 500
     except:
         traceback.print_exc()
         user.delete_from_db()
         return {"message": response_quote("operation_fatal_error")}, 500
Пример #4
0
 def delete(cls, _id: int):
     current_user = get_jwt_identity()
     user = UserModel.find_by_id(_id)
     if user:
         if user.session_key != current_user:
             return {"message": response_quote("code_401")}, 401
         user.delete_from_db()
         return {"message": response_quote("user_deleted")}, 201
     return {
         "message": response_quote("user_id_not_found").format(_id)
     }, 404
Пример #5
0
 def post(cls):
     jti = get_raw_jwt()["jti"]
     current_user = UserModel.find_by_session_key(get_jwt_identity())
     if current_user:
         current_user.session_key = None
         current_user.save_to_db()
         username = current_user.username
         BLACKLIST.add(jti)
         return {
             "message": response_quote("user_logged_out").format(username)
         }, 200
     return {"message": response_quote("code_400")}, 400
Пример #6
0
 def delete(cls, _id: int):
     current_user = get_jwt_identity()
     user = UserModel.find_by_id(_id)
     if user:
         if user.sha_private != current_user:
             return {"message": response_quote("code_401")}, 401
         user.delete_from_db()
         # TODO: удалить все jwt токены.
         return {"message": response_quote("user_deleted")}, 201
     return {
         "message": response_quote("user_id_not_found").format(_id)
     }, 404
Пример #7
0
 def post(cls, token: str):
     data = request.get_json()
     user = UserModel.find_by_token_2fa(token)
     if user:
         response = EmailSecondFA.check_2fa_code(token, data["code"])
         if response:
             access_token = create_access_token(identity=user.sha_private,
                                                expires_delta=EXPIRES_DELTA)
             refresh_token = create_refresh_token(identity=user.sha_private)
             return {
                 "access_token": access_token,
                 "refresh_token": refresh_token
             }, 200
         return {"message": response_quote("email2fa_failed")}, 400
     return {"message": response_quote("user_not_exist")}, 404
Пример #8
0
 def post(cls):
     # TODO: NOT PERFECT
     jti = get_raw_jwt()["jti"]
     username = UserModel.find_by_sha_token(get_jwt_identity()).username
     BLACKLIST.add(jti)
     return {
         "message": response_quote("user_logged_out").format(username)
     }, 200
Пример #9
0
 def post(cls, token: str):
     data = request.get_json()
     user = UserModel.find_by_token_2fa(token)
     if user:
         response = EmailSecondFA.check_2fa_code(token, data["code"])
         if response:
             password_salt, password_hash = PassCrypt.generate_password_hash(
                 data["new_password"])
             user.password_salt = password_salt
             user.password_hash = password_hash
             user.token_2fa = None
             user.session_key = None
             user.save_to_db()
             EmailSecondFA.force_revoke_2fa_code(token)
             return {"message": response_quote("user_password_reset")}, 201
         return {"message": response_quote("email2fa_failed")}, 401
     return {"message": response_quote("code_404")}, 404
Пример #10
0
 def post(cls, token: str):
     data = request.get_json()
     user = UserModel.find_by_token_2fa(token)
     if user:
         response = EmailSecondFA.check_2fa_code(token, data["code"])
         if response:
             session_key = hashlib.sha256(
                 str.encode(str(datetime.datetime.now()))).hexdigest()
             user.session_key = session_key
             user.token_2fa = None
             user.save_to_db()
             EmailSecondFA.force_revoke_2fa_code(token)
             access_token = create_access_token(
                 identity=user.session_key,
                 expires_delta=datetime.timedelta(hours=4))
             return {"access_token": access_token}, 200
         return {"message": response_quote("email2fa_failed")}, 401
     return {"message": response_quote("code_404")}, 404
Пример #11
0
 def put(cls, _id: int):
     data = request.get_json()
     current_user = get_jwt_identity()
     user = UserModel.find_by_id(_id)
     if user:
         if user.sha_private != current_user:
             return {"message": response_quote("code_401")}, 401
         user.username = data["username"]
         user.name = data["name"]
         user.surname = data["surname"]
         user.locality = data["locality"]
         user.balance = data["balance"]
         user.profile_pic = data["profile_pic"]
         user.second_fa_enabled = data["second_fa_enabled"]
         user.save_to_db()
         return {"message": response_quote("user_data_changed")}, 201
     return {
         "message": response_quote("user_id_not_found").format(_id)
     }, 404
Пример #12
0
 def get(cls, _id: int):
     user = UserModel.find_by_id(_id)
     if user:
         return {
             "username": user.username,
             "email": user.email,
             "balance": user.balance
         }, 200
     return {
         "message": response_quote("user_id_not_found").format(_id)
     }, 404
Пример #13
0
    def post(cls):
        data = request.get_json()

        if UserModel.find_by_email(data['email']):
            return {"message": response_quote("user_email_taken")}, 400

        password_salt, password_hash = PassCrypt.generate_password_hash(data["password"])
        superuser = UserModel(
            username=data["username"],
            email=data["email"],
            password_hash=password_hash,
            password_salt=password_salt
        )

        superuser.save_to_db()
        confirmation = ConfirmationModel(superuser.id)
        confirmation.confirmed = True
        confirmation.save_to_db()

        return {"message": response_quote("user_been_created")}, 201
Пример #14
0
 def post(cls):
     session_key = get_jwt_identity()
     if not UserModel.find_by_session_key(session_key):
         return {"message": response_quote("token_expired_signature")}, 401
     return {
         "access_token":
         create_access_token(identity=session_key,
                             expires_delta=EXPIRES_DELTA),
         "refresh_token":
         create_access_token(identity=session_key)
     }, 200
Пример #15
0
 def post(cls):
     data = request.get_json()
     if UserModel.find_by_email(data["email"]):
         return {"message": response_quote("user_email_taken")}, 400
     password_salt, password_hash = PassCrypt.generate_password_hash(
         data["password"])
     user = UserModel(username=data["username"],
                      password_hash=password_hash,
                      password_salt=password_salt,
                      email=data["email"])
     try:
         user.save_to_db()
         confirmation = ConfirmationModel(user.id)
         confirmation.save_to_db()
         user.confirm()
         return {"message": response_quote("user_been_created")}, 201
     except MailGunException as e:
         user.delete_from_db()  # rollback
         return {"message": str(e)}, 500
     except:
         traceback.print_exc()
         user.delete_from_db()
         return {"message": response_quote("operation_fatal_error")}, 500
Пример #16
0
 def post(cls):
     data = request.get_json()
     user = UserModel.find_by_email(data["email"])
     if user:
         try:
             token = hashlib.sha256(str.encode(user.email)).hexdigest()
             code = EmailSecondFA.generate_2fa_code(token)
             user.token_2fa = token
             user.save_to_db()
             user.password_reset_request(code)
             return {"request_token": token}, 200
         except MailGunException as e:
             return {"message": str(e)}, 500
     return {"message": response_quote("user_not_exist")}, 404
Пример #17
0
 def post(cls):
     data = request.get_json()
     user = UserModel.find_by_email(data["email"])
     if user and PassCrypt.check_password_hash(
             user.password_hash, user.password_salt, data["password"]):
         confirmation = user.most_recent_confirmation
         if confirmation and confirmation.confirmed:
             #  в ключ сессии закладывается текущее время сервера во время авторизации.
             user.session_key = hashlib.sha256(
                 str.encode(str(datetime.datetime.now()))).hexdigest()
             user.save_to_db()
             access_token = create_access_token(identity=user.session_key,
                                                expires_delta=EXPIRES_DELTA)
             refresh_token = create_refresh_token(identity=user.session_key)
             if user.second_fa_enabled:
                 try:
                     token = hashlib.sha256(str.encode(
                         user.email)).hexdigest()
                     code = EmailSecondFA.generate_2fa_code(token)
                     user.token_2fa = token
                     user.session_key = None
                     user.save_to_db()
                     user.send_email_2fa_code(code)
                     return {"verification_token": token}, 202
                 except MailGunException as e:
                     return {"message": str(e)}
             return {
                 "access_token": access_token,
                 "refresh_token": refresh_token
             }, 201
         else:
             return {
                 "message":
                 response_quote("user_not_confirmed").format(user.username)
             }, 400
     else:
         return {"message": response_quote("user_invalid_credentials")}, 401
Пример #18
0
 def post(cls):
     """
     :return: access_token, refresh_token
     """
     data = request.get_json()
     user = UserModel.find_by_email(data["email"])
     if user and b_crypt.check_password_hash(user.password,
                                             data["password"]):
         confirmation = user.most_recent_confirmation
         if confirmation and confirmation.confirmed:
             access_token = create_access_token(identity=user.sha_private,
                                                expires_delta=EXPIRES_DELTA)
             refresh_token = create_refresh_token(identity=user.sha_private)
             if user.second_fa_enabled:
                 try:
                     token = hashlib.sha256(str.encode(
                         user.sha_private)).hexdigest()
                     code = EmailSecondFA.generate_2fa_code(
                         token)  # еще подумать над этим функционалом
                     user.token_2fa = token
                     user.save_to_db()
                     user.send_email_2fa_code(code)
                     return {"verification_token": token}
                 except MailGunException as e:
                     return {"message": str(e)}
             return {
                 "access_token": access_token,
                 "refresh_token": refresh_token
             }, 201
         else:
             return {
                 "message":
                 response_quote("user_not_confirmed").format(user.username)
             }, 400
     else:
         return {"message": response_quote("user_invalid_credentials")}, 401
Пример #19
0
 def get(cls, _id: str):
     user = UserModel.find_by_id(_id)
     if user:
         return {
             "username": user.username,
             "name": user.name,
             "surname": user.surname,
             "locality": user.locality,
             "profile_pic": user.profile_pic,
             "second_fa_enabled": user.second_fa_enabled,
             "balance": user.balance
         }, 200
     return {
         "message": response_quote("user_id_not_found").format(_id)
     }, 404
Пример #20
0
    def post(cls):
        session_key = get_jwt_identity()
        data = request.get_json()
        user = UserModel.find_by_session_key(session_key)
        if not user:
            return {"message": response_quote("code_401")}, 401

        user_request = RequestModel(
            theme=data["theme"],
            title=data["title"],
            body=data["body"],
            status=data["status"],
            creator=user.id
        )
        user_request.save_to_db()

        return {"msg": "request created"}, 201
Пример #21
0
    def send_email_message(cls, email: List[str], subject: str, text: str,
                           html: str) -> Response:
        response = post(
            cls.BASE_URL,
            auth=("api", cls.MAILGUN_API_KEY),
            data={
                "from": f"devGoodGift {cls.MAILGUN_FROM_EMAIL}",
                "to": email,
                "subject": subject,
                "text": text,
                "html": html,
            },
        )

        if response.status_code != 200:
            raise MailGunException(response_quote("mailgun_sending_error"))
        return response
Пример #22
0
 def get(cls):
     current_user = get_jwt_identity()
     user = UserModel.find_by_session_key(current_user)
     if not user:
         return {"message": response_quote("code_401")}, 401
     return f"session key {current_user}"