summaryrefslogtreecommitdiff
path: root/src/jwebmail/__init__.py
diff options
context:
space:
mode:
authorJannis M. Hoffmann <jannis@fehcom.de>2023-12-03 19:22:12 +0100
committerJannis M. Hoffmann <jannis@fehcom.de>2023-12-03 19:22:12 +0100
commit2cf2a68bd1c25d8fe4f3126f40bd57982cc6b2a4 (patch)
treeb5c8ed0e1cfe8eac311829296a9aca062bb1abc1 /src/jwebmail/__init__.py
initial commit
Diffstat (limited to 'src/jwebmail/__init__.py')
-rw-r--r--src/jwebmail/__init__.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/jwebmail/__init__.py b/src/jwebmail/__init__.py
new file mode 100644
index 0000000..db0c796
--- /dev/null
+++ b/src/jwebmail/__init__.py
@@ -0,0 +1,91 @@
+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/<folder>", view_func=dh)
+
+ app.add_url_rule(
+ "/read/<msgid>", endpoint="read", view_func=login_required(readmail)
+ )
+ app.add_url_rule("/raw/<msgid>", 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/<folder>", view_func=login_required(move), methods=["POST"])