diff --git a/source/conf.ts b/source/conf.ts index 26520c6..324d515 100644 --- a/source/conf.ts +++ b/source/conf.ts @@ -79,6 +79,7 @@ namespace _espe.conf } >; server : { + host : string; port : int; path_base : string; }; @@ -238,6 +239,7 @@ namespace _espe.conf ], "server": ( ((node_server) => ({ + "host": "::", "port": (node_server["port"] ?? 4916), "path_base": (node_server["path_base"] ?? ""), })) (conf_raw["server"] ?? {}) @@ -433,6 +435,7 @@ namespace _espe.conf ), "server": ( ((node_server) => ({ + "host": "::", "port": (node_server["port"] ?? 4916), "path_base": (node_server["path_base"] ?? ""), })) (conf_raw["server"] ?? {}) @@ -628,6 +631,189 @@ namespace _espe.conf ), "server": ( ((node_server) => ({ + "host": "::", + "port": (node_server["port"] ?? 4916), + "path_base": (node_server["path_base"] ?? ""), + })) (conf_raw["server"] ?? {}) + ), + "database": ( + ((node_database) => { + const kind : string = (node_database["kind"] ?? "sqlite"); + const node_database_data_raw = (node_database["data"] ?? {}); + switch (kind) { + case "sqlite": { + return { + "kind": kind, + "data": { + "path": (node_database_data_raw["path"] ?? "data.sqlite"), + } + }; + break; + } + case "postgresql": { + return { + "kind": kind, + "data": node_database_data_raw, + }; + break; + } + default: { + throw (new Error("unhandled")); + break; + } + } + }) (conf_raw["database"] ?? {}) + ), + "email_sending": ( + ((node_email_sending) => { + const kind : string = (node_email_sending["kind"] ?? "console"); + const data_raw = (node_email_sending["data"] ?? {}); + switch (kind) { + case "regular": { + return { + "kind": kind, + "data": { + "smtp_credentials": (data_raw["smtp_credentials"] ?? null), + "sender": data_raw["sender"], + } + }; + break; + } + case "redirect": { + return { + "kind": kind, + "data": { + "smtp_credentials": (data_raw["smtp_credentials"] ?? null), + "sender": data_raw["sender"], + "target": data_raw["target"], + } + }; + break; + } + case "console": { + return { + "kind": kind, + "data": { + } + }; + break; + } + case "drop": { + return { + "kind": kind, + "data": { + } + }; + break; + } + default: { + throw (new Error("unhandled")); + break; + } + } + }) (conf_raw["email_sending"] ?? {}) + ), + "session_management": ( + ((node_session_management) => ({ + "in_memory": (node_session_management["in_memory"] ?? true), + "drop_all_at_start": (node_session_management["drop_all_at_start"] ?? true), + "lifetime": (node_session_management["lifetime"] ?? 900), + })) (conf_raw["session_management"] ?? {}) + ), + "settings": ( + ((node_settings) => ({ + "organisation": { + "name": ((node_settings["organisation"] ?? {})["name"] ?? "Example Orginsation"), // TODO: mandatory? + "domain": ((node_settings["organisation"] ?? {})["domain"] ?? "example.org"), // TODO: mandatory? + }, + "misc": ( + ((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": ( + ((node_settings_summon_email) => ({ + "remark": (node_settings_summon_email["remark"] ?? null), + })) (node_settings["summon_email"] ?? {}) + ), + "password_policy": ( + ((node_settings_password_policy) => ({ + "minimum_length": ( + ("minimum_length" in node_settings_password_policy) + ? node_settings_password_policy["minimum_length"] + : 8 + ), + "maximum_length": ( + ("maximum_length" in node_settings_password_policy) + ? node_settings_password_policy["maximum_length"] + : 240 + ), + "must_contain_letter": (node_settings_password_policy["must_contain_letter"] ?? true), + "must_contain_number": (node_settings_password_policy["must_contain_number"] ?? true), + "must_contain_special_character": (node_settings_password_policy["must_contain_special_character"] ?? true), + })) (node_settings["password_policy"] ?? {}) + ), + "password_change": ( + ((node_settings_password_change) => ({ + "cooldown_time": (node_settings_password_change["cooldown_time"] ?? 86400), + })) (node_settings["password_change"] ?? {}) + ), + "name_index": ( + ((node_settings_password_policy) => ({ + "veil": (node_settings_password_policy["veil"] ?? true), + "salt": (node_settings_password_policy["salt"] ?? ""), + })) (node_settings["name_index"] ?? {}) + ), + "connections": ( + ((node_settings_connections) => ({ + "frontend_url_base": (node_settings_connections["frontend_url_base"] ?? null), + "login_url": (node_settings_connections["login_url"] ?? null), + })) (node_settings["connections"] ?? {}) + ), + })) (conf_raw["settings"] ?? {}) + ), + "admins": (conf_raw["admins"] ?? []), + "outputs": (conf_raw["outputs"] ?? []), + }; + break; + } + case 4: { + _data = { + "general": ( + ((node_general) => ({ + "language": (node_general["language"] ?? null), + "verification_secret": (node_general["verification_secret"] ?? null), + })) (conf_raw["general"] ?? {}) + ), + "log": ( + ((node_log) => node_log.map( + (node_log_entry : any) => ({ + "kind": node_log_entry["kind"], + "data": Object.assign( + { + "format": "human_readable", + "threshold": "notice", + }, + (node_log_entry["data"] ?? {}) + ) + }) + )) ( + conf_raw["log"] + ?? + [ + { + "kind": "console", + "data": { + } + }, + ] + ) + ), + "server": ( + ((node_server) => ({ + "host": (node_server["host"] ?? "::"), "port": (node_server["port"] ?? 4916), "path_base": (node_server["path_base"] ?? ""), })) (conf_raw["server"] ?? {}) diff --git a/source/main.ts b/source/main.ts index 52cbf95..18fa155 100644 --- a/source/main.ts +++ b/source/main.ts @@ -176,11 +176,14 @@ async function main( // init await _espe.conf.load(args["conf_path"]); - if (_espe.conf.get().general.language === null) { - // do nothing - } - else { - lib_plankton.translate.promote(_espe.conf.get().general.language); + { + const language : (null | string) = _espe.conf.get().general.language; + if (language === null) { + // do nothing + } + else { + lib_plankton.translate.promote(language); + } } lib_plankton.log.conf_push( _espe.conf.get().log.map( @@ -306,6 +309,7 @@ async function main( } ); + // outputs _espe.service.member.listen_change( () => { lib_plankton.log.info( @@ -313,44 +317,62 @@ async function main( { } ); + _espe.conf.get().outputs.forEach( + output_description => { + const procedure : (() => Promise) = ( + (() => { + switch (output_description.kind) { + default: { + lib_plankton.log.warning( + "output_kind_unhandled", + { + "description": output_description, + } + ); + return (() => Promise.resolve(undefined)); + break; + } + case "authelia_file": { + return (() => _espe.service.member.output_authelia_file(output_description.data)); + break; + } + case "http": { + return (() => _espe.service.member.output_http(output_description.data)); + break; + } + case "authelia_call": { + return (() => _espe.service.member.output_authelia_call(output_description.data)); + break; + } + } + }) () + ); + ( + procedure() + .then( + () => { + } + ) + .catch( + (error) => { + lib_plankton.log.warning( + "output_procedure_failed", + { + "error": String(error), + } + ); + } + ) + ); + } + ); } ); - // outputs - { - _espe.conf.get().outputs.forEach( - output_description => { - switch (output_description.kind) { - default: { - lib_plankton.log.warning( - "output_kind_unhandled", - { - "description": output_description, - } - ); - break; - } - case "authelia_file": { - _espe.service.member.output_authelia_file(output_description.data); - break; - } - case "http": { - _espe.service.member.output_http(output_description.data); - break; - } - case "authelia_call": { - _espe.service.member.output_authelia_call(output_description.data); - break; - } - } - } - ); - } const rest_subject : lib_plankton.rest.type_rest = _espe.api.make(); const server : lib_plankton.server.type_subject = lib_plankton.server.make( - _espe.conf.get().server.port, async (input, metadata) => { - const http_request : lib_plankton.http.type_request = lib_plankton.http.decode_request(input); + const http_request : lib_plankton.http.type_request = lib_plankton.http.decode_request(input.toString()); const http_response : lib_plankton.http.type_response = await lib_plankton.rest.call( rest_subject, http_request, @@ -362,6 +384,12 @@ async function main( ); const output : string = lib_plankton.http.encode_response(http_response); return output; + }, + { + "host": _espe.conf.get().server.host, + "port": _espe.conf.get().server.port, + // DANGER! DANGER! + "threshold": 0.125, } ); diff --git a/source/services/member.ts b/source/services/member.ts index 1e272c8..933e8e9 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -967,7 +967,13 @@ namespace _espe.service.member "headers": { "Content-Type": "application/json", }, - "body": lib_plankton.json.encode(await _espe.service.member.export_authelia_user_data()), + // @ts-ignore + "body": Buffer.from( + lib_plankton.json.encode( + (await _espe.service.member.export_authelia_user_data()) + ), + "utf8" + ), }; const http_response : lib_plankton.http.type_response = await lib_plankton.http.call( http_request