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.