"""Provide basic settings and views""" import fileinput import os import re import shutil from pathlib import Path from flask import request, render_template from flask_basicauth import BasicAuth from autoreply_editor import app basic_auth = BasicAuth(app) maildrop_line = "|maildrop $HOME/.filter-autoreply" def qmail_status(user): """Find out whether the filter is currently activated for the given mail user""" with open(get_qmailfile(app.config.get("MAIL_USER")), encoding="utf8") as qmailfile: # trigger to check whether we have to re-open the file for initialisation initialise = False # try to find active filter if re.search( r"^\|maildrop \$HOME/\.filter-autoreply$", qmailfile.read(), re.MULTILINE ): return True else: # jump back to top of file because we've read it in the "if" qmailfile.seek(0) # filter is deactivated (commented) if re.search( r"^#\|maildrop \$HOME/\.filter-autoreply$", qmailfile.read(), re.MULTILINE, ): return False else: initialise = True # Append a commented filter command to the file if initialise: with open( get_qmailfile(app.config.get("MAIL_USER")), mode="a", encoding="utf8" ) as qmailfile: qmailfile.write("#|maildrop $HOME/.filter-autoreply") return False def get_messagefile(user): """Return message file of user, and create if necessary""" filepath = f"message-{user}.txt" if not os.path.isfile(filepath): Path(filepath).touch() return filepath def get_qmailfile(user): """Return qmail file of user, and create if necessary based on default qmail""" qmail_base = f"{str(Path.home())}/.qmail" filepath = f"{qmail_base}-{user}" if not os.path.isfile(filepath): shutil.copy(f"{qmail_base}-default", filepath) return filepath @app.route("/") def index(): with open(get_messagefile("user"), "r", encoding="utf-8") as messagefile: message = messagefile.read() return render_template( "index.html", message=message, qmail_status=qmail_status(app.config.get("MAIL_USER")), ) @app.route("/", methods=["POST"]) def index_post(): if request.method == "POST": if request.form["action"] == "message": input_message = request.form["message"] with open(get_messagefile("user"), "w", encoding="utf-8") as messagefile: messagefile.write(str(input_message)) result = "Success: The autoreply message has been updated!" if request.form["action"] == "qmail": # define whether to set a comment if request.form["status"] == "on": preis = "#" preshould = "" else: preis = "" preshould = "#" with fileinput.FileInput( get_qmailfile(app.config.get("MAIL_USER")), inplace=True, backup=".bak", ) as qmailfile: for line in qmailfile: print( line.replace( f"{preis}{maildrop_line}", f"{preshould}{maildrop_line}" ), end="", ) result = f"Success: the autoreply is now {request.form['status']}." try: return render_template("result.html", result=result) except UnboundLocalError: return render_template("result.html", result="Something went terribly wrong!")