Source code for flexget.api.core.user

from __future__ import annotations

from typing import TYPE_CHECKING

from flask import jsonify, request
from flask_login import current_user

from flexget.api import APIResource, api
from flexget.api.app import BadRequest, base_message_schema, success_response
from flexget.webserver import WeakPassword, change_password, generate_token

if TYPE_CHECKING:
    from flask import Response
    from sqlalchemy.orm import Session

user_api = api.namespace('user', description='Manage user login credentials')


[docs] class ObjectsContainer: user_password_input = { 'type': 'object', 'properties': {'password': {'type': 'string'}}, 'required': ['password'], 'additionalProperties': False, } user_token_response = {'type': 'object', 'properties': {'token': {'type': 'string'}}}
user_password_input_schema = api.schema_model( 'user_password_input', ObjectsContainer.user_password_input ) user_token_response_schema = api.schema_model( 'user_token_response', ObjectsContainer.user_token_response )
[docs] @user_api.route('/') @api.doc('Change user password') class UserManagementAPI(APIResource):
[docs] @api.validate(model=user_password_input_schema, description='Password change schema') @api.response(BadRequest) @api.response(200, 'Success', model=base_message_schema) @api.doc( description='Change user password. A score of at least 3 is needed.' 'See https://github.com/dropbox/zxcvbn for details' ) def put(self, session: Session = None) -> Response: """Change user password.""" user = current_user data = request.json try: change_password(username=user.name, password=data.get('password'), session=session) except WeakPassword as e: raise BadRequest(e.value) return success_response('Successfully changed user password')
[docs] @user_api.route('/token/') @api.doc('Change user token') class UserManagementTokenAPI(APIResource):
[docs] @api.response(200, 'Successfully got user token', user_token_response_schema) @api.doc(description='Get current user token') def get(self, session: Session = None) -> Response: token = current_user.token return jsonify({'token': token})
[docs] @api.response(200, 'Successfully changed user token', user_token_response_schema) @api.doc(description='Get new user token') def put(self, session: Session = None) -> Response: """Change current user token.""" token = generate_token(username=current_user.name, session=session) return jsonify({'token': token})