from configparser import ConfigParser from flask import ( Flask, request, render_template, Response, ) from nextcloudregister.lib import ( CONFIG_PATH, NextcloudApi, NextcloudApiCannotSendEmail, NextcloudApiException, NextcloudApiInvalidInputData, NextcloudApiNoEmailPassword, NextcloudApiPermissionDenied, NextcloudApiUsernamealreadyExists, NextcloudApiUnknownError, ) config = ConfigParser() config.read(CONFIG_PATH) app = Flask(__name__) base_uri = config.get("web", "base_uri", fallback="") base_uri = base_uri + ("" if base_uri.endswith("/") else "/") @app.route(base_uri, methods=["GET", "POST"]) def form_manager(): if request.method == "POST": return form_post() else: return form_get() def form_get(data=None, error=None, info=None, success=False): context = { "base_uri": base_uri, "data": data or {}, "disable": success, "error": error, "eula": config.get("web", "eula", fallback=""), "favicon": config.get("web", "favicon", fallback=""), "info": info, "instance_link": config.get("web", "instance_link", fallback=""), "max_accounts": config.getint("rules", "max_accounts", fallback=0), "org_link": config.get("web", "org_link", fallback=""), "success": success, } context["mandatory_password"] = config.getboolean( "rules", "mandatory_password", fallback=True, ) context["mandatory_email"] = config.getboolean( "rules", "mandatory_email", fallback=False, ) count_accounts = 0 api = NextcloudApi() try: count_accounts = api.count_accounts() except NextcloudApiException: context["max_accounts"] = 0 if count_accounts >= context["max_accounts"] and not success: context["disable"] = True context["error"] = ( "Tout les comptes disponibles sur cette instance ont deja été " "distribués." ) else: context["count_accounts"] = context["max_accounts"] - count_accounts return render_template("form.html", **context) def form_post(): mandatory_email = config.getboolean( "rules", "mandatory_email", fallback=False, ) mandatory_password = config.getboolean( "rules", "mandatory_password", fallback=False, ) # validate mandatory fields if not request.form.get("username"): return form_get( data=request.form, error="Un nom d'utilisateur est obligatoire pour vous inscrire." ) if mandatory_email and not request.form.get("email"): return form_get( data=request.form, error="Une adresse mail est obligatoire pour vous inscrire." ) if mandatory_password and not request.form.get("password1"): return form_get( data=request.form, error="Un mot de passe est obligatoire pour vous inscrire." ) # validate password if request.form.get("password1"): password1 = request.form.get("password1") password2 = request.form.get("password2") if not password1 == password2: return form_get( data=request.form, error="Les mots de passe ne correspondent pas." ) api = NextcloudApi() try: api.create_account( username=request.form.get("username"), password=request.form.get("password1"), email=request.form.get("email") ) except NextcloudApiCannotSendEmail: return form_get( data=request.form, error="Impossible d'envoyer un email pour la creation du compte." ) except NextcloudApiInvalidInputData: return form_get( data=request.form, error=( "Erreur interne. Merci de contacter l'administrateur de " "l'instance Nextcloud." ) ) except NextcloudApiNoEmailPassword: return form_get( data=request.form, error=( "Une addresse email ou un mot de passe sont obligatoires pour " "créer un compte Nextcloud." ) ) except NextcloudApiPermissionDenied: return form_get( data=request.form, error=( "Erreur interne. Merci de contacter l'administrateur de " "l'instance Nextcloud. (Permission denied)" ) ) except NextcloudApiUsernamealreadyExists: return form_get( data=request.form, error=( "Le nom d'utilisateur que vous avez choisi est déjà utilisé " "sur cette instance Nextcloud." ) ) except NextcloudApiUnknownError as err: return form_get( data=request.form, error=err.hint ) except NextcloudApiException as err: return form_get( data=request.form, error=( "Erreur interne. Merci de contacter l'administrateur de " "l'instance Nextcloud. (%s)" % err ) ) except Exception: return form_get( data=request.form, error=( "Erreur interne. Merci de contacter l'administrateur de " "l'instance Nextcloud." ) ) if config.get("web", "instance_link", fallback=""): return form_get( info=( "L'inscription est un succes, vous allez maintenat être " "redirigé vers votre instance Nextcloud." ), success=True, ) else: return form_get( info="Vous êtes maintenat inscrit sur cette instance Nextcloud", success=True, ) @app.route(base_uri + "style.css") def style(): context = { "color": config.get("web", "color") } css_content = render_template("style.css", **context) return Response(css_content, mimetype="text/css") application = app