nmtui: add secret-flags support to NmtPasswordFields

The existing option ALWAYS_ASK is never used. Add a more generic
option SHOW_SECRET_FLAGS to display a popup for choosing the secret
flags.
This commit is contained in:
Beniamino Galvani 2022-07-28 15:58:02 +02:00
parent 7f5f2eefca
commit 81be1923bc
2 changed files with 78 additions and 46 deletions

View file

@ -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,7 +45,7 @@ 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
*
@ -92,26 +92,55 @@ nmt_password_fields_get_password(NmtPasswordFields *fields)
return text;
}
static void
always_ask_changed(GObject *object, GParamSpec *pspec, gpointer fields)
{
g_object_notify(fields, "always-ask");
}
static void
show_password_changed(GObject *object, GParamSpec *pspec, gpointer fields)
{
g_object_notify(fields, "show-password");
}
static void
secret_flags_changed(GObject *object, GParamSpec *pspec, gpointer fields)
{
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);
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->always_ask =
NMT_NEWT_CHECKBOX(nmt_newt_checkbox_new(_("Ask for this password every time")));
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")));
}
@ -120,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),
@ -146,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,
@ -160,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) {
@ -194,9 +224,9 @@ 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:
nmt_newt_checkbox_set_active(priv->show_password, g_value_get_boolean(value));
@ -223,9 +253,10 @@ 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:
g_value_set_boolean(value, nmt_newt_checkbox_get_active(priv->show_password));
@ -283,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:
*

View file

@ -32,9 +32,9 @@ typedef struct {
GType nmt_password_fields_get_type(void);
typedef enum {
NMT_PASSWORD_FIELDS_ALWAYS_ASK = (1 << 0),
NMT_PASSWORD_FIELDS_SHOW_PASSWORD = (1 << 1),
NMT_PASSWORD_FIELDS_NOT_EMPTY = (1 << 2), /* Return NULL instead of empty string */
NMT_PASSWORD_FIELDS_SHOW_SECRET_FLAGS = (1 << 0),
NMT_PASSWORD_FIELDS_SHOW_PASSWORD = (1 << 1),
NMT_PASSWORD_FIELDS_NOT_EMPTY = (1 << 2), /* Return NULL instead of empty string */
} NmtPasswordFieldsExtras;
NmtNewtWidget *nmt_password_fields_new(int width, NmtPasswordFieldsExtras extras);