def update_user_password(id: int, password: str) -> bool: with session_scope() as session: user = User.get_by_id(session, id) if user is None: raise MissingUserError(f"User not found with id: {id}") user.password = password return True
def create_password_reset_token(self, owner: int, expires: datetime = None): assert owner, 'Owner required' assert expires is None or expires >= datetime.utcnow( ), 'Expiration must be in the future' issued = datetime.utcnow() expires = expires or datetime.utcnow() + timedelta(hours=24) with session_scope() as session: user = User.get_by_id(session, owner) roles = [role.name for role in user.roles] key = user.password token = jwt.encode(payload={ 'own': owner, 'roles': ','.join(roles), 'iss': self.issuer, 'iat': issued, 'exp': expires, }, key=key, algorithm=self.alg, headers={'tok': 'pas'}) return token
def user_recommended_events_valid(user_id: int): with session_scope() as session: user = User.get_by_id(session, user_id) recommended = user.recommended_events accepted = set([a.id for a in user.accepted_events]) return EventData.list([ e for e in recommended if e.end_date > datetime.now() and e.id not in accepted ])
def decode_refresh_token(self, token: str) -> Dict[str, Any]: assert token, 'Token required' assert jwt.get_unverified_header(token).get( 'tok') == 'ref', 'Refresh token required' user = jwt.decode(token, verify=False).get('own') with session_scope() as session: password = User.get_by_id(session, user).password key = self.secret + password return jwt.decode(token.encode(), key=key, algorithms=[self.alg], options={'verify_exp': False})
def get_active_by_user(user_id: int) -> List[EventViewData]: with session_scope() as session: # events = Event.get_all_active_by_user(session, user_id) user = User.get_by_id(session, user_id) events = Event.get_all_active(session) user_accepted = {event.id for event in user.accepted_events} user_recommended = {event.id for event in user.recommended_events} views = [ EventViewData(event, event.id in user_accepted, event.id in user_recommended) for event in events ] return views
def update_user_profile(id: int, food: List[int] = None, pantry: bool = None, eager: int = None): with session_scope() as session: user = User.get_by_id(session, id) if food: UserFoodPreference.update(session, id, food) if pantry: user.pitt_pantry = pantry if eager: user.eagerness = eager session.merge(user)
def decode_password_token(self, token: str, verify_exp: bool = False) -> Dict[str, Any]: assert token, 'Token required' assert jwt.get_unverified_header(token).get( 'tok') == 'pas', 'Password reset token required' user = jwt.decode(token, verify=False).get('own') with session_scope() as session: password = User.get_by_id(session, user).password return jwt.decode(token, key=password, algorithms=[self.alg], options={'verify_exp': verify_exp})
def create_refresh_token(self, owner: int) -> bytes: assert owner, 'Owner required' issued = datetime.utcnow() with session_scope() as session: user = User.get_by_id(session, owner) roles = [role.name for role in user.roles] key = self.secret + user.password token = jwt.encode(payload={ 'own': owner, 'roles': ','.join(roles), 'iss': self.issuer, 'iat': issued, }, key=key, algorithm=self.alg, headers={'tok': 'ref'}) return token
def change_user_password(id: int, old_password: str, new_password: str) -> bool: """ Changes user password from old to new :param id: :param old_password: :param new_password: :return: True if succeeded False if not (invalid old_password, etc.) """ with session_scope() as session: user = User.get_by_id(session, id) if user is None: raise MissingUserError(f"User not found with id: {id}") else: if not user.verify_password(old_password): return False user.password = new_password return True
def get_user_food_preferences(id: int) -> List[FoodPreferenceData]: with session_scope() as session: food_preferences = User.get_by_id(session, id).food_preferences return FoodPreferenceData.list(food_preferences)
def get_user_profile(id: int) -> Optional[UserProfileData]: with session_scope() as session: user = User.get_by_id(session, id) return None if not user else UserProfileData(user)
def update_expo_token(id: int, token: str) -> bool: with session_scope() as session: user = User.get_by_id(session, id) user.expo_token = token return True
def _is_user(session, id: int) -> bool: user = User.get_by_id(session, id) return user is not None
def user_accepted_events(user_id: int): with session_scope() as session: user = User.get_by_id(session, user_id) accepted = user.accepted_events return EventData.list(accepted)
def user_recommended_events(user_id: int): with session_scope() as session: user = User.get_by_id(session, user_id) recommended = user.recommended_events return EventData.list(recommended)
def _is_admin(session, id: int) -> bool: user = User.get_by_id(session, id) if user is None: raise MissingUserError(f"User not found with id: {id}") return user.is_admin