Spaces:
Running
Running
from flask import Flask, request, jsonify, render_template | |
from pymongo.mongo_client import MongoClient | |
from pymongo.server_api import ServerApi | |
from werkzeug.security import generate_password_hash | |
import os | |
import hmac | |
from functools import wraps | |
app = Flask(__name__, template_folder='/app/sudo/templates') | |
app.secret_key = os.getenv("FLASK_SECRET") | |
# MongoDB connection | |
uri = os.getenv("MONGO_URI") | |
client = MongoClient(uri, server_api=ServerApi('1')) | |
db = client['librechat'] | |
ADMIN_SECRET = os.getenv("ADMIN_SECRET") | |
# Authentication decorator | |
def require_auth(f): | |
def wrapper(*args, **kwargs): | |
auth_token = request.headers.get('X-Auth-Token') | |
if not auth_token or not hmac.compare_digest(auth_token, ADMIN_SECRET): | |
return jsonify({"error": "Unauthorized"}), 403 | |
return f(*args, **kwargs) | |
return wrapper | |
# Routes | |
def admin_panel(): | |
return render_template('index.html') | |
def login(): | |
if not hmac.compare_digest(request.json.get('password') or '', ADMIN_SECRET): | |
return jsonify({"error": "Invalid credentials"}), 401 | |
return jsonify({"token": ADMIN_SECRET}) | |
def list_users(): | |
users = list(db.users.find({}, {"_id": 0, "username": 1})) | |
return jsonify(users) | |
def add_user(): | |
user_data = { | |
"username": request.json["username"], | |
"password": generate_password_hash(request.json["password"]), | |
"role": "user" | |
} | |
db.users.insert_one(user_data) | |
return jsonify({"status": "User added"}) | |
def delete_user(username): | |
result = db.users.delete_one({"username": username}) | |
if result.deleted_count == 0: | |
return jsonify({"error": "User not found"}), 404 | |
return jsonify({"status": "User deleted"}) | |
def debug(): | |
return jsonify({ | |
"expected_password": os.getenv("ADMIN_SECRET", "NOT_SET!"), | |
"flask_secret_set": bool(os.getenv("FLASK_SECRET")), | |
"mongo_connected": bool(client) | |
}) | |
if __name__ == "__main__": | |
app.run(host='0.0.0.0', port=5000) |