from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from .config import Config import os from apscheduler.schedulers.background import BackgroundScheduler import logging db = SQLAlchemy() login_manager = LoginManager() scheduler = BackgroundScheduler() def create_app(): app = Flask(__name__, template_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'templates'), static_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'static')) app.config.from_object(Config) # Set up logging logging.basicConfig(filename='grimvault.log', level=logging.INFO, format='%(asctime)s:%(levelname)s:%(message)s') db.init_app(app) login_manager.init_app(app) login_manager.login_view = 'auth.login' from .routes import main, auth, files, admin app.register_blueprint(main) app.register_blueprint(auth) app.register_blueprint(files) app.register_blueprint(admin, url_prefix='/admin') with app.app_context(): db.create_all() create_admin_user() scheduler.add_job(delete_inactive_users, 'interval', hours=1) scheduler.start() return app def create_admin_user(): from .models import User from .utils import create_user admin_username = os.getenv('ADMIN_USERNAME') admin_password = os.getenv('ADMIN_PASSWORD') if admin_username and admin_password: existing_admin = User.query.filter_by(username=admin_username).first() if not existing_admin: result = create_user(admin_username, admin_password) if "successfully" in result: admin_user = User.query.filter_by(username=admin_username).first() admin_user.is_admin = True admin_user.storage_limit = 0 # Admin has no storage db.session.commit() logging.info(f"Admin user '{admin_username}' created successfully.") else: logging.error(f"Failed to create admin user: {result}") else: logging.info(f"Admin user '{admin_username}' already exists.") else: logging.warning("Admin credentials not provided in environment variables.") def delete_inactive_users(): from .models import User from datetime import datetime, timedelta with db.app.app_context(): inactive_threshold = datetime.utcnow() - timedelta(hours=42) inactive_users = User.query.filter(User.last_active < inactive_threshold).all() for user in inactive_users: db.session.delete(user) db.session.commit() logging.info(f"Deleted {len(inactive_users)} inactive users.")