This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch nm-vpn-username-capture
in repository enlightenment.
View the commit online.
commit 55019e9ecfcc778850781b34ea3550843f484c46
Author: [email protected] <[email protected]>
AuthorDate: Sun Jun 21 20:55:40 2026 -0600
networkmanager: add async nmcli username writer
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---
.../networkmanager/e_networkmanager_vpn_username.c | 88 +++++++++++++++++++++-
1 file changed, 86 insertions(+), 2 deletions(-)
diff --git a/src/modules/networkmanager/e_networkmanager_vpn_username.c b/src/modules/networkmanager/e_networkmanager_vpn_username.c
index c9f8b9b47..a86cbf2a2 100644
--- a/src/modules/networkmanager/e_networkmanager_vpn_username.c
+++ b/src/modules/networkmanager/e_networkmanager_vpn_username.c
@@ -41,6 +41,90 @@ enm_vpn_username_needed(const char *svc_short, const char *conn_type,
}
#ifndef ENM_VPN_USERNAME_TEST
-/* enm_vpn_username_set / enm_vpn_username_dialog / enm_vpn_username_maybe_prompt
- * are added in Tasks 2 and 3. */
+
+/* ---- shared shell-escape (same scheme as e_networkmanager_import.c) ------- */
+static char *
+_username_shell_escape(const char *s)
+{
+ Eina_Strbuf *b;
+ char *out;
+
+ if (!s) return strdup("");
+ b = eina_strbuf_new();
+ if (!b) return NULL;
+ for (const char *p = s; *p; p++)
+ {
+ if (*p == '\'') eina_strbuf_append(b, "'\\''");
+ else eina_strbuf_append_char(b, *p);
+ }
+ out = strdup(eina_strbuf_string_get(b));
+ eina_strbuf_free(b);
+ return out;
+}
+
+typedef struct _Username_Set_Ctx
+{
+ Enm_Username_Done_Cb cb;
+ void *data;
+ Ecore_Exe *exe;
+ Ecore_Event_Handler *handler_del;
+} Username_Set_Ctx;
+
+static Eina_Bool
+_username_set_on_del(void *data, int type EINA_UNUSED, void *event)
+{
+ Username_Set_Ctx *ctx = data;
+ Ecore_Exe_Event_Del *ev = event;
+
+ if (!ev || !ev->exe || ev->exe != ctx->exe)
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (ctx->handler_del) ecore_event_handler_del(ctx->handler_del);
+ if (ctx->cb)
+ ctx->cb(ctx->data, (ev->exited && ev->exit_code == 0));
+ free(ctx);
+ return ECORE_CALLBACK_DONE;
+}
+
+void
+enm_vpn_username_set(const char *conn_name, const char *username,
+ Enm_Username_Done_Cb cb, void *data)
+{
+ const char *nmcli;
+ char *esc_nmcli, *esc_name, *esc_user;
+ char cmd[4096];
+ Username_Set_Ctx *ctx;
+
+ if (!conn_name) { if (cb) cb(data, EINA_FALSE); return; }
+
+ nmcli = enm_import_nmcli_path();
+ if (!nmcli) { if (cb) cb(data, EINA_FALSE); return; }
+
+ esc_nmcli = _username_shell_escape(nmcli);
+ esc_name = _username_shell_escape(conn_name);
+ esc_user = _username_shell_escape(username);
+ if (!esc_nmcli || !esc_name || !esc_user)
+ {
+ free(esc_nmcli); free(esc_name); free(esc_user);
+ if (cb) cb(data, EINA_FALSE);
+ return;
+ }
+
+ snprintf(cmd, sizeof(cmd),
+ "'%s' connection modify '%s' vpn.data 'username=%s'",
+ esc_nmcli, esc_name, esc_user);
+ free(esc_nmcli); free(esc_name); free(esc_user);
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (!ctx) { if (cb) cb(data, EINA_FALSE); return; }
+ ctx->cb = cb;
+ ctx->data = ""
+ ctx->exe = ecore_exe_pipe_run(cmd,
+ ECORE_EXE_NOT_LEADER |
+ ECORE_EXE_TERM_WITH_PARENT, ctx);
+ if (!ctx->exe) { free(ctx); if (cb) cb(data, EINA_FALSE); return; }
+ ctx->handler_del = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
+ _username_set_on_del, ctx);
+}
+
#endif
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.