From fd57411a9d17c74a965b4dbdfe68148ca59033aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Thu, 20 Jun 2024 16:32:59 +0200 Subject: [PATCH] [mod] member management: auto_register option --- source/api/actions/member_project.ts | 15 +++++ source/conf.ts | 6 +- source/data/localization/deu.loc.json | 3 +- source/data/localization/eng.loc.json | 3 +- source/services/member.ts | 85 +++++++++++++++++---------- 5 files changed, 76 insertions(+), 36 deletions(-) diff --git a/source/api/actions/member_project.ts b/source/api/actions/member_project.ts index 99caab2..3d8f60c 100644 --- a/source/api/actions/member_project.ts +++ b/source/api/actions/member_project.ts @@ -105,6 +105,21 @@ namespace _espe.api ), } ); + if (! _espe.conf.get().settings.misc.auto_register) { + // do nothing + } + else { + // TODO: Werte in Konfiguration auslagern + await _espe.service.member.register( + member_id, + { + "email_use_veiled_address": false, + "email_use_nominal_address": false, + "email_redirect_to_private_address": false, + "password": null, + } + ); + } return Promise.resolve({ "status_code": 201, "data": member_id diff --git a/source/conf.ts b/source/conf.ts index 87febc9..b7e154f 100644 --- a/source/conf.ts +++ b/source/conf.ts @@ -22,8 +22,6 @@ namespace _espe.conf general : { language : (null | string); verbosity : ( - "none" - | "debug" | "notice" @@ -33,6 +31,8 @@ namespace _espe.conf "warning" | "error" + | + "none" ); verification_secret : (null | string); }; @@ -102,6 +102,7 @@ namespace _espe.conf misc : { prefix_for_veiled_email_addresses : string; facultative_membership_number : boolean; + auto_register : boolean; }; summon_email : { remark : string; @@ -258,6 +259,7 @@ namespace _espe.conf ((node_settings_misc) => ({ "prefix_for_veiled_email_addresses": (node_settings_misc["prefix_for_veiled_email_addresses"] ?? "member-"), "facultative_membership_number": (node_settings_misc["facultative_membership_number"] ?? false), + "auto_register": (node_settings_misc["auto_register"] ?? false), })) (node_settings["misc"] ?? {}) ), "summon_email": ( diff --git a/source/data/localization/deu.loc.json b/source/data/localization/deu.loc.json index 3508bd2..2d0abaa 100644 --- a/source/data/localization/deu.loc.json +++ b/source/data/localization/deu.loc.json @@ -8,7 +8,8 @@ "email.registration.subject": "Registrierung erfolgt", "email.registration.body": "Das Mitglied '{{name_display}}' hat sich soeben registriert:\n\n{{url}}", "email.activation.subject": "Freischaltung erfolgt", - "email.activation.body": "Hi, {{name_display}}\n\nDein Mitglieder-Konto wurde gerade freigeschalten. Du kannst dich nun anmelden:\n\nURL: {{url}}\nAnmelde-Name: {{name_login}}", + "email.activation.body": "Hi, {{name_display}}\n\nDein Mitglieder-Konto wurde gerade freigeschalten. Du kannst dich nun anmelden:\n\nURL: {{url}}\nAnmelde-Name: {{name_login}}\n{{password_info}}", + "email.activation.password_info": "Passwort: {{password}}\n\nBitte ändere dein Passwort zeitnah!", "email.password_change.initialization.subject": "Passwort-Änderung eingeleitet", "email.password_change.initialization.body": "Hi, {{name}}\n\nDie Funktion zum Ändern deines Passwortes wurde aufgerufen. Wenn du dein Passwort ändern willst, rufe folgenden Link auf:\n\n{{url}}\n", "email.password_change.execution.subject": "Passwort-Änderung abgeschlossen", diff --git a/source/data/localization/eng.loc.json b/source/data/localization/eng.loc.json index b646b39..80e2d64 100644 --- a/source/data/localization/eng.loc.json +++ b/source/data/localization/eng.loc.json @@ -8,7 +8,8 @@ "email.registration.subject": "Registration received", "email.registration.body": "The member '{{name_display}}' just registered:\n\n{{url}}", "email.activation.subject": "Activated", - "email.activation.body": "Hi, {{name_display}}\n\nYour account has just been activated. You may login now:\n\nURL: {{url}}\nLogin name: {{name_login}}", + "email.activation.body": "Hi, {{name_display}}\n\nYour account has just been activated. You may login now:\n\nURL: {{url}}\nLogin name: {{name_login}}\n{{password_info}}", + "email.activation.password_info": "Password: {{password}}\n\Please change your password soon!", "email.password_change.initialization.subject": "Password change initialized", "email.password_change.initialization.body": "Hi, {{name}}\n\nThe function for changing your password has been triggered. If you want to change your password, open the folloling link:\n\n{{url}}", "email.password_change.execution.subject": "Password change concluded", diff --git a/source/services/member.ts b/source/services/member.ts index 3f3619b..12d7bd2 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -191,9 +191,18 @@ namespace _espe.service.member /** */ async function send_activation_email( - member_object : _espe.type.member_object + member_object : _espe.type.member_object, + options : { + password ?: (null | string); + } = {} ) : Promise { + options = Object.assign( + { + "password": null, + }, + options + ); if (! member_object.enabled) { // do nothing } @@ -219,6 +228,20 @@ namespace _espe.service.member "name_display": name_display(member_object), "name_login": name_login(member_object), "url": (_espe.conf.get().settings.connections.login_url ?? "--"), + "password_info": ( + ( + (options.password === undefined) + || + (options.password === null) + ) + ? "" + : lib_plankton.string.coin( + lib_plankton.translate.get("email.activation.body"), + { + "password": options.password, + } + ) + ), } ) ); @@ -424,28 +447,31 @@ namespace _espe.service.member ); const member_object : _espe.type.member_object = await get(member_id); + let flaws : Array<{incident : string; details : Record;}> = []; - const password_set : boolean = ( - (data.password !== null) - && - (data.password !== "") - ); + let password_value : string; + let password_generated : boolean; if (member_object.registered) { flaws.push({"incident": "already_registered", "details": {}}); + password_value = ""; + password_generated = false; } else { if ( - password_set - && (data.password !== null) + && + (data.password !== "") ) { flaws = flaws.concat( validate_password(data.password) .map(flaw => ({"incident": ("password_" + flaw.incident), "details": flaw.details})) ); + password_value = data.password; + password_generated = false; } else { - // do nothing + password_value = generate_password(); + password_generated = true; } } @@ -456,7 +482,7 @@ namespace _espe.service.member member_object.email_use_veiled_address = data.email_use_veiled_address; member_object.email_use_nominal_address = data.email_use_nominal_address; member_object.email_redirect_to_private_address = data.email_redirect_to_private_address; - member_object.password_image = await password_image(data.password); + member_object.password_image = await password_image(password_value); member_object.registered = true; await _espe.repository.member.update(member_id, member_object); signal_change(); @@ -475,29 +501,24 @@ namespace _espe.service.member } ) ); - if (url === null) { - // do nothing - } - else { - /*await*/ _espe.helpers.notify_admins( - lib_plankton.string.coin( - "{{head}} | {{core}}", - { - "head": _espe.conf.get().settings.organisation.name, - "core": lib_plankton.translate.get("email.registration.subject"), - } - ), - lib_plankton.string.coin( - lib_plankton.translate.get("email.registration.body"), - { - "name_display": name_display(member_object), - "url": url, - } - ) - ); - } + /*await*/ _espe.helpers.notify_admins( + lib_plankton.string.coin( + "{{head}} | {{core}}", + { + "head": _espe.conf.get().settings.organisation.name, + "core": lib_plankton.translate.get("email.registration.subject"), + } + ), + lib_plankton.string.coin( + lib_plankton.translate.get("email.registration.body"), + { + "name_display": name_display(member_object), + "url": (url ?? "?"), + } + ) + ); } - /*await*/ send_activation_email(member_object); + /*await*/ send_activation_email(member_object, {"password": password_generated ? password_value : null}); } return Promise.resolve(flaws);