| 
						
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1,18 +1,21 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				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 sqlalchemy.exc import IntegrityError, InvalidRequestError
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				# from sqlalchemy.exc import IntegrityError, InvalidRequestError
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from sqlalchemy.orm import Session
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from sqlalchemy.orm.exc import NoResultFound
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				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')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    password = json_data.get('password')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -24,13 +27,11 @@ def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            'status': 'fail',
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            '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):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        error = {'error': 'Password auth failed'},
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return http.Response(error, status=401, headers={'WWW-Authenticate': 'Bearer'})
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    secret = settings['JWT'].get('SECRET')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return ExtJSONResponse(error, status=401, headers={'WWW-Authenticate': 'Bearer'})
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    payload = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        '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
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    token = JWT.encode(payload, secret=secret)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    token = jwt.encode(payload)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    data = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        'status': 'success',
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -46,7 +47,7 @@ def login(settings: Settings, json_data: http.RequestData, session: Session):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        'auth_token': token
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return data
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return ExtJSONResponse(data, 200)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				# TODO Add user logout
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -55,38 +56,42 @@ def logout():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				# TODO Add user registration
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				def register(user_rep: UserCreateSchema, session: Session, mail: Mail):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    email_check = session.query(User).filter_by(email=user_rep['email']).one_or_none()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if email_check is not None:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        message = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            'status': 'error',
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            'message': 'user email address is already in use'
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return http.Response(message, status=400)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    user = User(email=user_rep['email'], password=user_rep['password'])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    session.add(user)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    session.commit()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    msg = Message("Thank you for registering please confirm your email", recipients=[user_rep['email']])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    mail.send(msg)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				# def register(user_rep: UserCreateSchema, session: Session, mail: Mail):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				def register():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # email_check = session.query(User).filter_by(email=user_rep['email']).one_or_none()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # if email_check is not None:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #     message = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #         'status': 'error',
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #         'message': 'user email address is already in use'
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #     }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #     return http.Response(message, status=400)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # user = User(email=user_rep['email'], password=user_rep['password'])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # session.add(user)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # session.commit()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    #
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # 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
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				def confirm(json_data: http.RequestData, session: Session):
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -100,9 +105,8 @@ def reset():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				routes = [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Route('/login', 'POST', login),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Route('/register', 'POST', register),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # Route('/register', 'POST', register),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Route('/status', 'GET', user_profile)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				auth_routes = [Include('/auth', routes)]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				auth_routes = [Include('/auth', name='auth', routes=routes)]
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |