| 
						
						
						
					 | 
					 | 
					@ -1,18 +1,21 @@
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					"""
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import datetime as dt
 | 
					 | 
					 | 
					 | 
					import datetime as dt
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from apistar import Component, http, Route, Include
 | 
					 | 
					 | 
					 | 
					from apistar import http, Route, Include
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from apistar_jwt.token import JWT
 | 
					 | 
					 | 
					 | 
					from apistar_jwt.token import JWT, JWTUser
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# from apistar_mail import Message, Mail
 | 
					 | 
					 | 
					 | 
					# from apistar_mail import Message, Mail
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from sqlalchemy.exc import IntegrityError, InvalidRequestError
 | 
					 | 
					 | 
					 | 
					# from sqlalchemy.exc import IntegrityError, InvalidRequestError
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					from sqlalchemy.orm import Session
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from sqlalchemy.orm.exc import NoResultFound
 | 
					 | 
					 | 
					 | 
					from sqlalchemy.orm.exc import NoResultFound
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from cookie_api.models import User
 | 
					 | 
					 | 
					 | 
					from cookie_api.models import User
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from cookie_api.schema import
 | 
					 | 
					 | 
					 | 
					from cookie_api.util import ExtJSONResponse
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
					 | 
					 | 
					 | 
					# from cookie_api.schema import
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					def login(json_data: http.RequestData, session: Session, jwt: JWT):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    user_id = json_data.get('email')
 | 
					 | 
					 | 
					 | 
					    user_id = json_data.get('email')
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    password = json_data.get('password')
 | 
					 | 
					 | 
					 | 
					    password = json_data.get('password')
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -24,13 +27,11 @@ def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            'status': 'fail',
 | 
					 | 
					 | 
					 | 
					            'status': 'fail',
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            'message': 'User does not exist'
 | 
					 | 
					 | 
					 | 
					            'message': 'User does not exist'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return http.Response(error, status=400, headers={'WWW-Authenticate': 'Bearer'})
 | 
					 | 
					 | 
					 | 
					        return ExtJSONResponse(error, status=400, headers={'WWW-Authenticate': 'Bearer'})
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if not user.check_password(password):
 | 
					 | 
					 | 
					 | 
					    if not user.check_password(password):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        error = {'error': 'Password auth failed'},
 | 
					 | 
					 | 
					 | 
					        error = {'error': 'Password auth failed'},
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return http.Response(error, status=401, headers={'WWW-Authenticate': 'Bearer'})
 | 
					 | 
					 | 
					 | 
					        return ExtJSONResponse(error, status=401, headers={'WWW-Authenticate': 'Bearer'})
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    secret = settings['JWT'].get('SECRET')
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    payload = {
 | 
					 | 
					 | 
					 | 
					    payload = {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'exp': dt.datetime.utcnow() + dt.timedelta(days=0, minutes=60),  # Expiration date of the token
 | 
					 | 
					 | 
					 | 
					        'exp': dt.datetime.utcnow() + dt.timedelta(days=0, minutes=60),  # Expiration date of the token
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -38,7 +39,7 @@ def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'sub': user.id  # the subject of the token
 | 
					 | 
					 | 
					 | 
					        'sub': user.id  # the subject of the token
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    token = JWT.encode(payload, secret=secret)
 | 
					 | 
					 | 
					 | 
					    token = jwt.encode(payload)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    data = {
 | 
					 | 
					 | 
					 | 
					    data = {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'status': 'success',
 | 
					 | 
					 | 
					 | 
					        'status': 'success',
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -46,7 +47,7 @@ def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'auth_token': token
 | 
					 | 
					 | 
					 | 
					        'auth_token': token
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return data
 | 
					 | 
					 | 
					 | 
					    return ExtJSONResponse(data, 200)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# TODO Add user logout
 | 
					 | 
					 | 
					 | 
					# TODO Add user logout
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -55,38 +56,42 @@ def logout():
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# TODO Add user registration
 | 
					 | 
					 | 
					 | 
					# TODO Add user registration
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def register(user_rep: UserCreateSchema, session: Session, mail: Mail):
 | 
					 | 
					 | 
					 | 
					# def register(user_rep: UserCreateSchema, session: Session, mail: Mail):
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    email_check = session.query(User).filter_by(email=user_rep['email']).one_or_none()
 | 
					 | 
					 | 
					 | 
					def register():
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    # email_check = session.query(User).filter_by(email=user_rep['email']).one_or_none()
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if email_check is not None:
 | 
					 | 
					 | 
					 | 
					    #
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        message = {
 | 
					 | 
					 | 
					 | 
					    # if email_check is not None:
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            'status': 'error',
 | 
					 | 
					 | 
					 | 
					    #     message = {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            'message': 'user email address is already in use'
 | 
					 | 
					 | 
					 | 
					    #         'status': 'error',
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					    #         'message': 'user email address is already in use'
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return http.Response(message, status=400)
 | 
					 | 
					 | 
					 | 
					    #     }
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    #     return http.Response(message, status=400)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    user = User(email=user_rep['email'], password=user_rep['password'])
 | 
					 | 
					 | 
					 | 
					    #
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    # user = User(email=user_rep['email'], password=user_rep['password'])
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    session.add(user)
 | 
					 | 
					 | 
					 | 
					    #
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    session.commit()
 | 
					 | 
					 | 
					 | 
					    # session.add(user)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    # session.commit()
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    msg = Message("Thank you for registering please confirm your email", recipients=[user_rep['email']])
 | 
					 | 
					 | 
					 | 
					    #
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    mail.send(msg)
 | 
					 | 
					 | 
					 | 
					    # msg = Message("Thank you for registering please confirm your email", recipients=[user_rep['email']])
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # mail.send(msg)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    #
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # headers = {}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # message = {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    #     'status': 'success',
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    #     'message': 'Please check your inbox and confirm your email'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    # return http.Response(message, status=201, headers=headers)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    pass
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    headers = {}
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    message = {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'status': 'success',
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        'message': 'Please check your inbox and confirm your email'
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return http.Response(message, status=201, headers=headers)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					def user_profile(user: JWTUser, session: Session): # -> UserSchema
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    try:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        user = session.query(User).filter_by(id=user.id).one()
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    except NoResultFound as e:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        error = {'message': str(e)}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        return ExtJSONResponse(error, 400)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    return ExtJSONResponse(user.to_dict())
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					@annotate(authentication=[JWTAuthentication()])
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def user_profile(auth: Auth, settings: Settings, session: Session) -> UserSchema:
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    token = JWT(token=auth.token, settings=settings)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    user_id = token.payload.get('sub')
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    user = session.query(User).filter_by(id=user_id).one()
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return UserSchema(user)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# TODO Add email confirmation
 | 
					 | 
					 | 
					 | 
					# TODO Add email confirmation
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def confirm(json_data: http.RequestData, session: Session):
 | 
					 | 
					 | 
					 | 
					def confirm(json_data: http.RequestData, session: Session):
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -100,9 +105,8 @@ def reset():
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					routes = [
 | 
					 | 
					 | 
					 | 
					routes = [
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Route('/login', 'POST', login),
 | 
					 | 
					 | 
					 | 
					    Route('/login', 'POST', login),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Route('/register', 'POST', register),
 | 
					 | 
					 | 
					 | 
					    # Route('/register', 'POST', register),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Route('/status', 'GET', user_profile)
 | 
					 | 
					 | 
					 | 
					    Route('/status', 'GET', user_profile)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					]
 | 
					 | 
					 | 
					 | 
					]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					auth_routes = [Include('/auth', routes)]
 | 
					 | 
					 | 
					 | 
					auth_routes = [Include('/auth', name='auth', routes=routes)]
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					"""
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
 
 |