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 95e3700d2443413ba6b0fa01258e53ee5a369738
Author: [email protected] <[email protected]>
AuthorDate: Sun Jun 21 21:51:30 2026 -0600

    networkmanager: drop connect-time VPN username field
    
    Research of the canonical NM front-ends (nm-applet, plasma-nm) and the
    network-manager-openvpn auth-dialog confirms the username is exclusively a
    vpn.data property set before connecting; the openvpn plugin rejects username
    as a secret ('property username invalid or not supported') and rejects any
    mid-activation connection change ('modified since activation'). So the
    connect-time username injection cannot work and is removed. Username is
    captured only at import time (writes vpn.data before any activation); the
    connect dialog asks for the password only, like every other NM UI.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---
 src/modules/networkmanager/agent.c            | 93 ++++++---------------------
 src/modules/networkmanager/e_networkmanager.c | 19 +-----
 src/modules/networkmanager/e_networkmanager.h |  3 +-
 3 files changed, 21 insertions(+), 94 deletions(-)

diff --git a/src/modules/networkmanager/agent.c b/src/modules/networkmanager/agent.c
index 3ac0dd591..a3d2ca111 100644
--- a/src/modules/networkmanager/agent.c
+++ b/src/modules/networkmanager/agent.c
@@ -37,10 +37,6 @@ struct _E_NM_Agent_Dialog
    char               **field_names;
    Evas_Object        **field_entries;
    unsigned int         n_fields;
-   /* VPN mode: when set, username_entry holds a username *property* (not a
-    * secret) — persisted to vpn.data on OK instead of returned via reply. */
-   Eina_Bool            has_username_field;
-   Evas_Object         *username_entry;
 };
 
 static E_NM_Agent_Dialog *_current_dialog = NULL;
@@ -68,52 +64,28 @@ _dialog_send_ok(E_NM_Agent_Dialog *ad)
      }
    else
      {
-        /* NM rejects any connection change made during an active connect
-         * ("modified since activation"), so the username cannot be written to
-         * vpn.data here.  Instead return it in the secrets dict for THIS
-         * activation (the openvpn plugin merges vpn secrets over vpn.data),
-         * exactly as nm-applet does.  The extra "username" slot is appended
-         * after the real secret fields. */
-        char        *user = NULL;
-        unsigned int extra = 0;
-
-        if (ad->has_username_field && ad->username_entry)
+        const char **values = calloc(ad->n_fields ?: 1, sizeof(*values));
+        char **utf8 = calloc(ad->n_fields ?: 1, sizeof(*utf8));
+        if (!values || !utf8)
           {
-             user = elm_entry_markup_to_utf8(
-                       elm_entry_entry_get(ad->username_entry));
-             if (user && user[0]) extra = 1;
-          }
-
-        unsigned int total = ad->n_fields + extra;
-        const char **names  = calloc(total ?: 1, sizeof(*names));
-        char       **values = calloc(total ?: 1, sizeof(*values));
-        if (!names || !values)
-          {
-             free(names); free(values); free(user);
+             free(values); free(utf8);
              e_nm_agent_reply_cancel(ad->req);
           }
         else
           {
              for (unsigned int i = 0; i < ad->n_fields; i++)
                {
-                  names[i]  = ad->field_names[i];
-                  values[i] = elm_entry_markup_to_utf8(
-                                 elm_entry_entry_get(ad->field_entries[i]));
-                  if (!values[i]) values[i] = strdup("");
+                  utf8[i] = elm_entry_markup_to_utf8(
+                               elm_entry_entry_get(ad->field_entries[i]));
+                  values[i] = utf8[i] ?: "";
                }
-             if (extra)
-               {
-                  names[ad->n_fields]  = "username";
-                  values[ad->n_fields] = user;  /* ownership moves to array */
-                  user = NULL;
-               }
-             e_nm_agent_reply_vpn_secrets(ad->req, names,
-                   (const char *const *)values, total);
-             for (unsigned int i = 0; i < total; i++) free(values[i]);
+             e_nm_agent_reply_vpn_secrets(ad->req,
+                   (const char *const *)ad->field_names,
+                   values, ad->n_fields);
+             for (unsigned int i = 0; i < ad->n_fields; i++) free(utf8[i]);
+             free(utf8);
              free(values);
-             free(names);
           }
-        free(user);
      }
    ad->req = NULL;
    e_object_del(E_OBJECT(ad->dialog));
@@ -385,8 +357,7 @@ _dialog_new(E_NM_Agent_Request *req, const char *ssid)
 static E_NM_Agent_Dialog *
 _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
                 const char *service_type, const char *message,
-                const char *const *fields, unsigned int n_fields,
-                Eina_Bool need_username)
+                const char *const *fields, unsigned int n_fields)
 {
    E_NM_Agent_Dialog *ad;
    Evas_Object *frame, *box, *table;
@@ -403,7 +374,6 @@ _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
    ad->req    = req;
    ad->is_vpn = EINA_TRUE;
    ad->n_fields = n_fields;
-   ad->has_username_field = need_username;
    ad->field_names = calloc(n_fields ?: 1, sizeof(*ad->field_names));
    ad->field_entries = calloc(n_fields ?: 1, sizeof(*ad->field_entries));
    used = calloc(n_fields ?: 1, sizeof(*used));
@@ -467,31 +437,6 @@ _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
    evas_object_show(table);
    _field_column_min_width_set(table, 1);
 
-   unsigned int base = 0;
-   if (need_username)
-     {
-        Evas_Object *label, *entry;
-
-        label = elm_label_add(table);
-        elm_object_text_set(label, _("Username"));
-        evas_object_size_hint_weight_set(label, 0, 0);
-        evas_object_size_hint_align_set(label, 1.0, 0.5);
-        elm_table_pack(table, label, 0, 0, 1, 1);
-        evas_object_show(label);
-
-        entry = elm_entry_add(table);
-        elm_entry_single_line_set(entry, EINA_TRUE);
-        elm_entry_scrollable_set(entry, EINA_TRUE);
-        evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0);
-        evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
-        evas_object_smart_callback_add(entry, "activated",
-                                       _entry_activated_cb, ad);
-        elm_table_pack(table, entry, 1, 0, 1, 1);
-        evas_object_show(entry);
-        ad->username_entry = entry;
-        base = 1;
-     }
-
    for (unsigned int i = 0; i < n_fields; i++)
      {
         Evas_Object *label, *entry;
@@ -501,7 +446,7 @@ _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
         elm_object_text_set(label, _vpn_field_label_get(field));
         evas_object_size_hint_weight_set(label, 0, 0);
         evas_object_size_hint_align_set(label, 1.0, 0.5);
-        elm_table_pack(table, label, 0, base + i, 1, 1);
+        elm_table_pack(table, label, 0, i, 1, 1);
         evas_object_show(label);
 
         entry = elm_entry_add(table);
@@ -512,7 +457,7 @@ _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
         evas_object_smart_callback_add(entry, "activated",
                                        _entry_activated_cb, ad);
-        elm_table_pack(table, entry, 1, base + i, 1, 1);
+        elm_table_pack(table, entry, 1, i, 1, 1);
         evas_object_show(entry);
 
         ad->field_entries[i] = entry;
@@ -526,8 +471,7 @@ _vpn_dialog_new(E_NM_Agent_Request *req, const char *conn_name,
                                   _dialog_key_down_cb, ad);
    e_object_del_attach_func_set(E_OBJECT(dialog), _dialog_del_cb);
    e_object_data_set(E_OBJECT(dialog), ad);
-   if (ad->username_entry) elm_object_focus_set(ad->username_entry, EINA_TRUE);
-   else if (n_fields > 0) elm_object_focus_set(ad->field_entries[0], EINA_TRUE);
+   if (n_fields > 0) elm_object_focus_set(ad->field_entries[0], EINA_TRUE);
    elm_win_center(dialog->win, 1, 1);
    return ad;
 }
@@ -577,8 +521,7 @@ static void
 _agent_ui_vpn_request_cb(void *data EINA_UNUSED, E_NM_Agent_Request *req,
                          const char *conn_name, const char *service_type,
                          const char *message,
-                         const char *const *fields, unsigned int n_fields,
-                         Eina_Bool need_username)
+                         const char *const *fields, unsigned int n_fields)
 {
    if (_current_dialog)
      {
@@ -588,7 +531,7 @@ _agent_ui_vpn_request_cb(void *data EINA_UNUSED, E_NM_Agent_Request *req,
      }
    _current_dialog = _vpn_dialog_new(req, conn_name, service_type,
                                      message,
-                                     fields, n_fields, need_username);
+                                     fields, n_fields);
    if (!_current_dialog) { e_nm_agent_reply_cancel(req); return; }
 }
 
diff --git a/src/modules/networkmanager/e_networkmanager.c b/src/modules/networkmanager/e_networkmanager.c
index 1717fbff3..f2c1fc738 100644
--- a/src/modules/networkmanager/e_networkmanager.c
+++ b/src/modules/networkmanager/e_networkmanager.c
@@ -1,6 +1,5 @@
 #include "e_mod_main.h"
 #include "e_networkmanager_vpn.h"
-#include "e_networkmanager_vpn_username.h"
 #include <ctype.h>
 
 /* -------------------------------------------------------------------------- */
@@ -3611,19 +3610,7 @@ _agent_get_secrets(const Eldbus_Service_Interface *iface,
              return NULL;
           }
 
-        /* The username is a connection *property* (vpn.data["username"]), never
-         * a secret, so NM never prompts for it.  When it is missing for a
-         * username-auth VPN, inject a username field into the dialog and
-         * persist it back to vpn.data on OK.  Pointers returned by
-         * _agent_vpn_data_find alias into `info`, valid until the clear below. */
-        {
-           const char *short_name = _agent_vpn_service_short_name(info.svc_type);
-           const char *conn_type  = _agent_vpn_data_find(&info, "connection-type");
-           const char *cur_user   = _agent_vpn_data_find(&info, "username");
-           Eina_Bool need_username =
-              enm_vpn_username_needed(short_name, conn_type, cur_user);
-
-        if (fields.len == 0 && !need_username)
+        if (fields.len == 0)
           {
              WRN("GetSecrets: no VPN secrets requested by hints or flags");
              e_nm_agent_reply_cancel(req);
@@ -3638,15 +3625,13 @@ _agent_get_secrets(const Eldbus_Service_Interface *iface,
                                     info.conn_id ?: "VPN", info.svc_type,
                                     fields.message,
                                     (const char *const *)fields.items,
-                                    fields.len,
-                                    need_username);
+                                    fields.len);
           }
         else
           {
              WRN("No VPN SecretAgent UI callback; cancelling");
              e_nm_agent_reply_cancel(req);
           }
-        }
 
         _agent_vpn_field_list_clear(&fields);
         _agent_vpn_conn_info_clear(&info);
diff --git a/src/modules/networkmanager/e_networkmanager.h b/src/modules/networkmanager/e_networkmanager.h
index 46579890e..9ed81d26f 100644
--- a/src/modules/networkmanager/e_networkmanager.h
+++ b/src/modules/networkmanager/e_networkmanager.h
@@ -44,8 +44,7 @@ typedef void (*E_NM_Agent_VPN_Secrets_Request_Cb)(void *data,
         const char *service_type,
         const char *message,
         const char *const *fields,
-        unsigned int n_fields,
-        Eina_Bool need_username);
+        unsigned int n_fields);
 
 typedef struct _E_NM_Agent_Callbacks E_NM_Agent_Callbacks;
 struct _E_NM_Agent_Callbacks

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to