From 45c44bc52ef6e0e29a136e31b19a4fb190b05cd8 Mon Sep 17 00:00:00 2001 From: Giacomo Sanchietti Date: Thu, 6 Mar 2025 15:17:53 +0100 Subject: [PATCH 1/3] feat: handle mail field --- imageroot/api-moduled/handlers/add-user/post | 11 +++++++++++ .../api-moduled/handlers/add-user/validate-input.json | 8 +++++++- imageroot/api-moduled/handlers/alter-user/post | 11 +++++++++++ .../handlers/alter-user/validate-input.json | 8 +++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/imageroot/api-moduled/handlers/add-user/post b/imageroot/api-moduled/handlers/add-user/post index 989c39d8..0f0a2900 100755 --- a/imageroot/api-moduled/handlers/add-user/post +++ b/imageroot/api-moduled/handlers/add-user/post @@ -29,6 +29,7 @@ groups = request.get('groups', []) password = request.get('password', '') display_name = request.get('display_name', '') locked = request.get('locked', False) +mail = request.get('mail', '') sambatool_cmd = ['podman', 'exec', '-i', 'samba-dc', 'samba-tool'] adduser_cmd = sambatool_cmd + ['user', 'create', user] @@ -55,4 +56,14 @@ if display_name: 'pdbedit', '-u', user, f'--fullname={display_name}'] subprocess.run(setname_cmd, stdout=sys.stderr, check=True, text=True) +if mail: + # retrieve the user's DN, example: + # dn: CN=Administrator,CN=Users,DC=ad,DC=leader,DC=cluster0,DC=gs,DC=nethserver,DC=net + getdn_cmd = sambatool_cmd + ['user', 'show', user, '--attributes=dn'] + proc = subprocess.run(getdn_cmd, check=True, capture_output=True, text=True) + dn = proc.stdout.strip() + ldbedit_cmd = ['podman', 'exec', '-i', 'samba-dc', 'ldbmodify', '-i', '-H', '/var/lib/samba/private/sam.ldb'] + ldbedit_input = f'{dn}\nchangetype: modify\nreplace: mail\nmail: {mail}\n' + subprocess.run(ldbedit_cmd, input=ldbedit_input, stdout=sys.stderr, check=True, text=True) + json.dump({"status": "success", "message": "user_created"}, fp=sys.stdout) diff --git a/imageroot/api-moduled/handlers/add-user/validate-input.json b/imageroot/api-moduled/handlers/add-user/validate-input.json index 925545d5..fd896ee1 100644 --- a/imageroot/api-moduled/handlers/add-user/validate-input.json +++ b/imageroot/api-moduled/handlers/add-user/validate-input.json @@ -12,7 +12,8 @@ "locked": false, "groups": [ "developers" - ] + ], + "mail": "alice@nethserver.org" } ], "required": [ @@ -51,6 +52,11 @@ "type": "string", "minLength": 1 } + }, + "mail": { + "title": "Email address", + "type": "string", + "format": "email" } }, "$defs": {} diff --git a/imageroot/api-moduled/handlers/alter-user/post b/imageroot/api-moduled/handlers/alter-user/post index 89b690f4..004d0f50 100755 --- a/imageroot/api-moduled/handlers/alter-user/post +++ b/imageroot/api-moduled/handlers/alter-user/post @@ -58,4 +58,15 @@ if 'display_name' in request: 'pdbedit', '-u', user, f'--fullname={display_name}'] subprocess.run(setname_cmd, stdout=sys.stderr, check=True, text=True) +if 'mail' in request: + mail = request['mail'] + # retrieve the user's DN, example: + # dn: CN=Administrator,CN=Users,DC=ad,DC=leader,DC=cluster0,DC=gs,DC=nethserver,DC=net + getdn_cmd = sambatool_cmd + ['user', 'show', user, '--attributes=dn'] + proc = subprocess.run(getdn_cmd, check=True, capture_output=True, text=True) + dn = proc.stdout.strip() + ldbedit_cmd = ['podman', 'exec', '-i', 'samba-dc', 'ldbmodify', '-i', '-H', '/var/lib/samba/private/sam.ldb'] + ldbedit_input = f'{dn}\nchangetype: modify\nreplace: mail\nmail: {mail}\n' + subprocess.run(ldbedit_cmd, input=ldbedit_input, stdout=sys.stderr, check=True, text=True) + json.dump({"status": "success", "message": "user_altered"}, fp=sys.stdout) diff --git a/imageroot/api-moduled/handlers/alter-user/validate-input.json b/imageroot/api-moduled/handlers/alter-user/validate-input.json index 1f5d62b6..80df6dc5 100644 --- a/imageroot/api-moduled/handlers/alter-user/validate-input.json +++ b/imageroot/api-moduled/handlers/alter-user/validate-input.json @@ -12,7 +12,8 @@ "locked": false, "groups": [ "developers","managers" - ] + ], + "mail": "alice@nethserver.org" } ], "required": [ @@ -51,6 +52,11 @@ "uniqueItems": true, "minLength": 1 } + }, + "mail": { + "title": "Email address", + "type": "string", + "format": "email" } }, "$defs": {} From ef42f771580302e462a03dfe7ca07c84fbaaed5a Mon Sep 17 00:00:00 2001 From: Giacomo Sanchietti Date: Fri, 7 Mar 2025 17:34:52 +0100 Subject: [PATCH 2/3] chore(user-manager): bump release --- build-images.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build-images.sh b/build-images.sh index 57b6be49..473ab5fd 100644 --- a/build-images.sh +++ b/build-images.sh @@ -70,7 +70,10 @@ if ! buildah containers --format "{{.ContainerName}}" | grep -q nodebuilder-samb fi echo "Downloading user manager ${user_manager_version} UI..." -curl -f -O -L https://github.com/NethServer/ns8-user-manager/releases/download/${user_manager_version}/ns8-user-manager-${user_manager_version}.tar.gz +user_manager_version=mail_notify #FIXME +#curl -f -L -O https://github.com/NethServer/ns8-user-manager/releases/download/${user_manager_version}/ns8-user-manager-${user_manager_version}.tar.gz +curl -f -L -o ns8-user-manager-${user_manager_version}.tar.gz https://github.com/NethServer/ns8-user-manager/archive/refs/heads/mail_notify.tar.gz +#curl -f -O -L https://github.com/NethServer/ns8-user-manager/releases/download/${user_manager_version}/ns8-user-manager-${user_manager_version}.tar.gz echo "Build static UI files with node..." buildah run \ From 2aefda820066c7d75ff6f3f92b1c77be4865509a Mon Sep 17 00:00:00 2001 From: Giacomo Sanchietti Date: Fri, 7 Mar 2025 17:39:02 +0100 Subject: [PATCH 3/3] feat(user-manager): show extra fields --- imageroot/api-moduled/handlers/list-users/post | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imageroot/api-moduled/handlers/list-users/post b/imageroot/api-moduled/handlers/list-users/post index c7a4ce64..a74cdfa6 100755 --- a/imageroot/api-moduled/handlers/list-users/post +++ b/imageroot/api-moduled/handlers/list-users/post @@ -16,8 +16,8 @@ request = json.load(sys.stdin) domain = Ldapproxy().get_domain(os.environ['REALM'].lower()) -users = Ldapclient.factory(**domain).list_users() +users = Ldapclient.factory(**domain).list_users(extra_info=True) users = sorted(users, key=lambda rec: rec['user']) -json.dump({"status": "success", "message": "users_listed", "users": users}, fp=sys.stdout) \ No newline at end of file +json.dump({"status": "success", "message": "users_listed", "users": users}, fp=sys.stdout)