import os.path as ospath import pwd import sys from flask import Flask from flask_babel import Babel, get_locale from flask_login import LoginManager, login_required from jinja2 import ChainableUndefined from .css import compile_css_command from .read_mails import load_user from .render_mail import format_mail from .view import add_view_funcs from .webmail import ( about, displayheaders, login, logout, move, rawmail, readmail, sendmail, writemail, ) if sys.version_info >= (3, 11): from tomllib import load as toml_load else: from toml import load as toml_load __version__ = "2.0.0" def validate_config(app): conf = app.config assert "@" in conf["JWEBMAIL"]["ADMIN_MAIL"] assert pwd.getpwnam(conf["JWEBMAIL"]["READ_MAILS"]["MAILBOX_USER"]) assert ospath.isdir(conf["JWEBMAIL"]["READ_MAILS"]["MAILBOX"]) assert ospath.isfile(conf["JWEBMAIL"]["READ_MAILS"]["AUTHENTICATOR"]) assert ospath.isfile(conf["JWEBMAIL"]["READ_MAILS"]["BACKEND"]) def create_app(): app = Flask(__name__) app.jinja_options = dict(undefined=ChainableUndefined) app.config.from_file("../../jwebmail.toml", load=toml_load, text=False) validate_config(app) Babel(app, locale_selector=lambda: "de") app.cli.add_command(compile_css_command) login_manager = LoginManager() login_manager.login_view = "login" login_manager.user_loader(load_user) login_manager.init_app(app) @app.context_processor def inject_version(): return {"version": "4.0", "get_locale": get_locale, "format_mail": format_mail} add_view_funcs(app) route(app) return app def route(app): app.add_url_rule("/", view_func=login, methods=["GET", "POST"]) app.add_url_rule("/about", view_func=about) app.add_url_rule("/logout", view_func=logout) dh = login_required(displayheaders) app.add_url_rule("/home/", view_func=dh) app.add_url_rule("/home/", view_func=dh) app.add_url_rule( "/read/", endpoint="read", view_func=login_required(readmail) ) app.add_url_rule("/raw/", endpoint="raw", view_func=login_required(rawmail)) app.add_url_rule("/write", endpoint="write", view_func=login_required(writemail)) app.add_url_rule( "/write", endpoint="send", view_func=login_required(sendmail), methods=["POST"] ) app.add_url_rule("/move/", view_func=login_required(move), methods=["POST"])