yt-dlp-host
72 строки · 2.2 Кб
1from functools import wraps2from flask import request, jsonify3from src.json_utils import load_keys, save_keys, load_tasks4from config import REQUEST_LIMIT, TASK_CLEANUP_TIME5import secrets6
7def generate_key():8return secrets.token_urlsafe(32)9
10def check_rate_limit(api_key):11tasks = load_tasks()12key_name = get_key_name(api_key)13rate = 014for task_name, task_info in tasks.items():15if task_info['key_name'] == key_name:16rate += 117if rate >= REQUEST_LIMIT: return False18return True19
20def check_api_key(required_permission):21def decorator(f):22@wraps(f)23def decorated_function(*args, **kwargs):24api_key = request.headers.get('X-API-Key')25if not api_key:26return jsonify({'error': 'No API key provided'}), 40127if not check_rate_limit(api_key):28return jsonify({'error': f'Rate limit exceeded. Maximum {REQUEST_LIMIT} requests per {TASK_CLEANUP_TIME} minutes.'}), 42929key_info = get_key_info(api_key)30if not key_info:31return jsonify({'error': 'Invalid API key'}), 40132permissions = key_info['permissions']33if required_permission not in permissions:34return jsonify({'error': 'Insufficient permissions'}), 40335return f(*args, **kwargs)36return decorated_function37return decorator38
39def get_key_name(api_key):40keys = load_keys()41for key_name, key_info in keys.items():42if key_info['key'] == api_key:43return key_name44return None45
46def create_api_key(name, permissions):47keys = load_keys()48new_key = generate_key()49keys[name] = {50'key': new_key,51'permissions': permissions52}53save_keys(keys)54return new_key55
56def delete_api_key(name):57keys = load_keys()58if name in keys:59del keys[name]60save_keys(keys)61return True62return False63
64def get_all_keys():65return load_keys()66
67def get_key_info(api_key):68keys = load_keys()69key_info = next((item for item in keys.values() if item['key'] == api_key), None)70return key_info71
72if load_keys() == {}: create_api_key("admin", ["create_key", "delete_key", "get_key", "get_keys", "get_video", "get_audio", "get_info"])73