diff options
Diffstat (limited to 'src/nmtui/nmt-password-fields.c')
-rw-r--r-- | src/nmtui/nmt-password-fields.c | 130 |
1 files changed, 83 insertions, 47 deletions
diff --git a/src/nmtui/nmt-password-fields.c b/src/nmtui/nmt-password-fields.c index 09573c727f..2aad77ecf6 100644 --- a/src/nmtui/nmt-password-fields.c +++ b/src/nmtui/nmt-password-fields.c @@ -25,7 +25,7 @@ typedef struct { NmtPasswordFieldsExtras extras; NmtNewtEntry *entry; - NmtNewtCheckbox *always_ask; + NmtNewtPopup *secret_flags; NmtNewtCheckbox *show_password; char *init_password; @@ -37,7 +37,7 @@ enum { PROP_WIDTH, PROP_EXTRAS, PROP_PASSWORD, - PROP_ALWAYS_ASK, + PROP_SECRET_FLAGS, PROP_SHOW_PASSWORD, LAST_PROP @@ -45,8 +45,9 @@ enum { /** * NmtPasswordFieldsExtras: - * @NMT_PASSWORD_FIELDS_ALWAYS_ASK: show an "Always ask" checkbox + * @NMT_PASSWORD_FIELDS_SHOW_SECRET_FLAGS: show the secret flags popup * @NMT_PASSWORD_FIELDS_SHOW_PASSWORD: show a "Show password" checkbox + * @NMT_PASSWORD_FIELDS_NOT_EMPTY: return NULL instead of empty string * * Extra widgets to include in an #NmtPasswordFields */ @@ -82,30 +83,64 @@ static const char * nmt_password_fields_get_password(NmtPasswordFields *fields) { NmtPasswordFieldsPrivate *priv = NMT_PASSWORD_FIELDS_GET_PRIVATE(fields); + const char *text; - return nmt_newt_entry_get_text(priv->entry); + text = nmt_newt_entry_get_text(priv->entry); + if (priv->extras & NMT_PASSWORD_FIELDS_NOT_EMPTY) + return nm_str_not_empty(text); + + return text; } static void -always_ask_changed(GObject *object, GParamSpec *pspec, gpointer fields) +show_password_changed(GObject *object, GParamSpec *pspec, gpointer fields) { - g_object_notify(fields, "always-ask"); + g_object_notify(fields, "show-password"); } static void -show_password_changed(GObject *object, GParamSpec *pspec, gpointer fields) +secret_flags_changed(GObject *object, GParamSpec *pspec, gpointer fields) { - g_object_notify(fields, "show-password"); + g_object_notify(fields, "secret-flags"); +} + +static guint +secret_flags_from_popup_idx(guint idx) +{ + switch (idx) { + case 1: + return NM_SETTING_SECRET_FLAG_AGENT_OWNED; + case 2: + return NM_SETTING_SECRET_FLAG_NOT_SAVED; + default: + case 0: + return NM_SETTING_SECRET_FLAG_NONE; + } +} + +static guint +secret_flags_to_popup_idx(guint flags) +{ + if (flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED) + return 1; + if (flags & NM_SETTING_SECRET_FLAG_NOT_SAVED) + return 2; + return 0; } static void nmt_password_fields_init(NmtPasswordFields *fields) { - NmtPasswordFieldsPrivate *priv = NMT_PASSWORD_FIELDS_GET_PRIVATE(fields); - - priv->entry = NMT_NEWT_ENTRY(nmt_newt_entry_new(-1, 0)); - priv->always_ask = - NMT_NEWT_CHECKBOX(nmt_newt_checkbox_new(_("Ask for this password every time"))); + NmtPasswordFieldsPrivate *priv = NMT_PASSWORD_FIELDS_GET_PRIVATE(fields); + NmtNewtPopupEntry entries[] = { + {_("Store password for all users"), NULL}, + {_("Store password only for this user"), NULL}, + {_("Ask password every time"), NULL}, + {}, + }; + + priv->entry = NMT_NEWT_ENTRY(nmt_newt_entry_new(-1, 0)); + priv->secret_flags = NMT_NEWT_POPUP(nmt_newt_popup_new(entries)); priv->show_password = NMT_NEWT_CHECKBOX(nmt_newt_checkbox_new(_("Show password"))); } @@ -114,20 +149,12 @@ nmt_password_fields_constructed(GObject *object) { NmtPasswordFieldsPrivate *priv = NMT_PASSWORD_FIELDS_GET_PRIVATE(object); NmtNewtGrid *grid = NMT_NEWT_GRID(object); + guint row = 0; - nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->entry), 0, 0); - - if (priv->extras & NMT_PASSWORD_FIELDS_ALWAYS_ASK) { - nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->always_ask), 0, 1); - g_signal_connect(priv->always_ask, - "notify::active", - G_CALLBACK(always_ask_changed), - object); - } else - g_clear_object(&priv->always_ask); + nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->entry), 0, row++); if (priv->extras & NMT_PASSWORD_FIELDS_SHOW_PASSWORD) { - nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->show_password), 0, 2); + nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->show_password), 0, row++); g_signal_connect(priv->show_password, "notify::active", G_CALLBACK(show_password_changed), @@ -140,6 +167,15 @@ nmt_password_fields_constructed(GObject *object) } else g_clear_object(&priv->show_password); + if (priv->extras & NMT_PASSWORD_FIELDS_SHOW_SECRET_FLAGS) { + nmt_newt_grid_add(grid, NMT_NEWT_WIDGET(priv->secret_flags), 0, row++); + g_signal_connect(priv->secret_flags, + "notify::active-id", + G_CALLBACK(secret_flags_changed), + object); + } else + g_clear_object(&priv->secret_flags); + g_object_bind_property(priv->entry, "text", object, @@ -154,9 +190,9 @@ nmt_password_fields_finalize(GObject *object) { NmtPasswordFieldsPrivate *priv = NMT_PASSWORD_FIELDS_GET_PRIVATE(object); - if (priv->always_ask) { - g_signal_handlers_disconnect_by_func(priv->always_ask, - G_CALLBACK(always_ask_changed), + if (priv->secret_flags) { + g_signal_handlers_disconnect_by_func(priv->secret_flags, + G_CALLBACK(secret_flags_changed), object); } if (priv->show_password) { @@ -188,13 +224,12 @@ nmt_password_fields_set_property(GObject *object, case PROP_PASSWORD: nmt_password_fields_set_password(fields, g_value_get_string(value)); break; - case PROP_ALWAYS_ASK: - if (priv->always_ask) - nmt_newt_checkbox_set_active(priv->always_ask, g_value_get_boolean(value)); + case PROP_SECRET_FLAGS: + nmt_newt_popup_set_active(priv->secret_flags, + secret_flags_to_popup_idx(g_value_get_uint(value))); break; case PROP_SHOW_PASSWORD: - if (priv->show_password) - nmt_newt_checkbox_set_active(priv->show_password, g_value_get_boolean(value)); + nmt_newt_checkbox_set_active(priv->show_password, g_value_get_boolean(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -218,13 +253,13 @@ nmt_password_fields_get_property(GObject *object, guint prop_id, GValue *value, case PROP_PASSWORD: g_value_set_string(value, nmt_password_fields_get_password(entry)); break; - case PROP_ALWAYS_ASK: - if (priv->always_ask) - g_value_set_boolean(value, nmt_newt_checkbox_get_active(priv->always_ask)); + case PROP_SECRET_FLAGS: + g_value_set_uint( + value, + secret_flags_from_popup_idx(nmt_newt_popup_get_active(priv->secret_flags))); break; case PROP_SHOW_PASSWORD: - if (priv->show_password) - g_value_set_boolean(value, nmt_newt_checkbox_get_active(priv->show_password)); + g_value_set_boolean(value, nmt_newt_checkbox_get_active(priv->show_password)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -279,18 +314,19 @@ nmt_password_fields_class_init(NmtPasswordFieldsClass *entry_class) PROP_PASSWORD, g_param_spec_string("password", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** - * NmtPasswordFields:always-ask: + * NmtPasswordFields:secret-flags: * - * The current state of the "Always ask" checkbox. + * The current state of the "Secret flags" popup. */ - g_object_class_install_property( - object_class, - PROP_ALWAYS_ASK, - g_param_spec_boolean("always-ask", - "", - "", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_SECRET_FLAGS, + g_param_spec_uint("secret-flags", + "", + "", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * NmtPasswordFields:show-password: * |