forked from osmocom/wireshark
Prefs/Extcap: Added support for password which is never stored on the disk
This commit is contained in:
parent
6d0bd4e8e1
commit
6c9cb8f3fa
|
@ -1051,6 +1051,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
||||||
prefs_get_module_effect_flags@Base 2.5.0
|
prefs_get_module_effect_flags@Base 2.5.0
|
||||||
prefs_get_max_value@Base 2.3.0
|
prefs_get_max_value@Base 2.3.0
|
||||||
prefs_get_name@Base 2.3.0
|
prefs_get_name@Base 2.3.0
|
||||||
|
prefs_get_password_value@Base 3.7.0
|
||||||
prefs_get_range_value@Base 2.3.0
|
prefs_get_range_value@Base 2.3.0
|
||||||
prefs_get_range_value_real@Base 2.3.0
|
prefs_get_range_value_real@Base 2.3.0
|
||||||
prefs_get_string_list@Base 1.9.1
|
prefs_get_string_list@Base 1.9.1
|
||||||
|
@ -1083,6 +1084,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
||||||
prefs_register_filename_preference@Base 1.9.1
|
prefs_register_filename_preference@Base 1.9.1
|
||||||
prefs_register_module_alias@Base 2.9.0
|
prefs_register_module_alias@Base 2.9.0
|
||||||
prefs_register_obsolete_preference@Base 1.9.1
|
prefs_register_obsolete_preference@Base 1.9.1
|
||||||
|
prefs_register_password_preference@Base 3.7.0
|
||||||
prefs_register_protocol@Base 1.9.1
|
prefs_register_protocol@Base 1.9.1
|
||||||
prefs_register_protocol_obsolete@Base 3.5.0
|
prefs_register_protocol_obsolete@Base 3.5.0
|
||||||
prefs_register_protocol_subtree@Base 1.9.1
|
prefs_register_protocol_subtree@Base 1.9.1
|
||||||
|
@ -1104,6 +1106,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
||||||
prefs_set_enum_string_value@Base 3.5.0
|
prefs_set_enum_string_value@Base 3.5.0
|
||||||
prefs_set_gui_theme_is_dark@Base 2.5.0
|
prefs_set_gui_theme_is_dark@Base 2.5.0
|
||||||
prefs_set_module_effect_flags@Base 2.5.0
|
prefs_set_module_effect_flags@Base 2.5.0
|
||||||
|
prefs_set_password_value@Base 3.7.0
|
||||||
prefs_set_pref@Base 1.9.1
|
prefs_set_pref@Base 1.9.1
|
||||||
prefs_set_preference_effect_fields@Base 3.3.0
|
prefs_set_preference_effect_fields@Base 3.3.0
|
||||||
prefs_set_range_value@Base 2.1.0
|
prefs_set_range_value@Base 2.1.0
|
||||||
|
|
|
@ -3055,6 +3055,11 @@ routines -
|
||||||
void prefs_register_string_preference(module_t *module, const char *name,
|
void prefs_register_string_preference(module_t *module, const char *name,
|
||||||
const char *title, const char *description, char **var)
|
const char *title, const char *description, char **var)
|
||||||
|
|
||||||
|
/* Register a preference with a password (a character-string) value. */
|
||||||
|
/* The value is hold during runtime, only in memory. It is never written to disk */
|
||||||
|
void prefs_register_password_preference(module_t *module, const char *name,
|
||||||
|
const char *title, const char *description, char **var)
|
||||||
|
|
||||||
/* Register a preference with a file name (string) value.
|
/* Register a preference with a file name (string) value.
|
||||||
* File name preferences are basically like string preferences
|
* File name preferences are basically like string preferences
|
||||||
* except that the GUI gives the user the ability to browse for the
|
* except that the GUI gives the user the ability to browse for the
|
||||||
|
|
|
@ -68,6 +68,10 @@ They previously shipped with Npcap 1.55.
|
||||||
|
|
||||||
* Capture Options dialog contains same configuration icon as Welcome Screen. It is possible to configure interface there.
|
* Capture Options dialog contains same configuration icon as Welcome Screen. It is possible to configure interface there.
|
||||||
|
|
||||||
|
* Extcap dialog remembers password items during runtime therefore it is possible to run extcap multiple times in row. Passwords are never stored to disk.
|
||||||
|
|
||||||
|
* It is possible to set extcap passwords on cli for tshark and other cli tools.
|
||||||
|
|
||||||
// === Removed Features and Support
|
// === Removed Features and Support
|
||||||
|
|
||||||
// === Removed Dissectors
|
// === Removed Dissectors
|
||||||
|
|
|
@ -101,6 +101,7 @@ struct pref_custom_cbs {
|
||||||
#define PREF_DECODE_AS_UINT (1u << 12) /* XXX - These are only supported for "internal" (non-protocol) */
|
#define PREF_DECODE_AS_UINT (1u << 12) /* XXX - These are only supported for "internal" (non-protocol) */
|
||||||
#define PREF_DECODE_AS_RANGE (1u << 13) /* use and not as a generic protocol preference */
|
#define PREF_DECODE_AS_RANGE (1u << 13) /* use and not as a generic protocol preference */
|
||||||
#define PREF_OPEN_FILENAME (1u << 14)
|
#define PREF_OPEN_FILENAME (1u << 14)
|
||||||
|
#define PREF_PASSWORD (1u << 15) /* like string, but never saved to prefs file */
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GUI_ALL,
|
GUI_ALL,
|
||||||
|
@ -249,6 +250,9 @@ WS_DLL_PUBLIC range_t* prefs_get_range_value_real(pref_t *pref, pref_source_t so
|
||||||
WS_DLL_PUBLIC gboolean prefs_add_decode_as_value(pref_t *pref, guint value, gboolean replace);
|
WS_DLL_PUBLIC gboolean prefs_add_decode_as_value(pref_t *pref, guint value, gboolean replace);
|
||||||
WS_DLL_PUBLIC gboolean prefs_remove_decode_as_value(pref_t *pref, guint value, gboolean set_default);
|
WS_DLL_PUBLIC gboolean prefs_remove_decode_as_value(pref_t *pref, guint value, gboolean set_default);
|
||||||
|
|
||||||
|
WS_DLL_PUBLIC unsigned int prefs_set_password_value(pref_t *pref, const char* value, pref_source_t source);
|
||||||
|
WS_DLL_PUBLIC char* prefs_get_password_value(pref_t *pref, pref_source_t source);
|
||||||
|
|
||||||
WS_DLL_PUBLIC void reset_pref(pref_t *pref);
|
WS_DLL_PUBLIC void reset_pref(pref_t *pref);
|
||||||
|
|
||||||
/** read the preferences file (or similar) and call the callback
|
/** read the preferences file (or similar) and call the callback
|
||||||
|
|
86
epan/prefs.c
86
epan/prefs.c
|
@ -334,6 +334,7 @@ free_pref(gpointer data, gpointer user_data _U_)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
free_string_like_preference(pref);
|
free_string_like_preference(pref);
|
||||||
break;
|
break;
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
|
@ -1906,6 +1907,21 @@ void prefs_register_decode_as_preference(module_t *module, const char *name,
|
||||||
preference->info.base = 10;
|
preference->info.base = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register a preference with password value.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
prefs_register_password_preference(module_t *module, const char *name,
|
||||||
|
const char *title, const char *description,
|
||||||
|
const char **var)
|
||||||
|
{
|
||||||
|
DIAG_OFF(cast-qual)
|
||||||
|
register_string_like_preference(module, name, title, description,
|
||||||
|
(char **)var, PREF_PASSWORD, NULL, FALSE);
|
||||||
|
DIAG_ON(cast-qual)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gboolean prefs_add_decode_as_value(pref_t *pref, guint value, gboolean replace)
|
gboolean prefs_add_decode_as_value(pref_t *pref, guint value, gboolean replace)
|
||||||
{
|
{
|
||||||
switch(pref->type)
|
switch(pref->type)
|
||||||
|
@ -2026,6 +2042,7 @@ pref_stash(pref_t *pref, gpointer unused _U_)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
g_free(pref->stashed_val.string);
|
g_free(pref->stashed_val.string);
|
||||||
pref->stashed_val.string = g_strdup(*pref->varp.string);
|
pref->stashed_val.string = g_strdup(*pref->varp.string);
|
||||||
break;
|
break;
|
||||||
|
@ -2111,6 +2128,7 @@ pref_unstash(pref_t *pref, gpointer unstash_data_p)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) {
|
if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) {
|
||||||
unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
|
unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
|
||||||
g_free(*pref->varp.string);
|
g_free(*pref->varp.string);
|
||||||
|
@ -2217,6 +2235,7 @@ reset_stashed_pref(pref_t *pref) {
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
g_free(pref->stashed_val.string);
|
g_free(pref->stashed_val.string);
|
||||||
pref->stashed_val.string = g_strdup(pref->default_val.string);
|
pref->stashed_val.string = g_strdup(pref->default_val.string);
|
||||||
break;
|
break;
|
||||||
|
@ -2261,6 +2280,7 @@ pref_clean_stash(pref_t *pref, gpointer unused _U_)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
if (pref->stashed_val.string != NULL) {
|
if (pref->stashed_val.string != NULL) {
|
||||||
g_free(pref->stashed_val.string);
|
g_free(pref->stashed_val.string);
|
||||||
pref->stashed_val.string = NULL;
|
pref->stashed_val.string = NULL;
|
||||||
|
@ -3743,7 +3763,7 @@ prefs_get_string_list(const gchar *str)
|
||||||
g_free(slstr);
|
g_free(slstr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cur_c == '"' && ! backslash) {
|
if (cur_c == '"' && !backslash) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PRE_STRING:
|
case PRE_STRING:
|
||||||
/* We hadn't yet started processing a string; this starts the
|
/* We hadn't yet started processing a string; this starts the
|
||||||
|
@ -3763,7 +3783,7 @@ prefs_get_string_list(const gchar *str)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (cur_c == '\\' && ! backslash) {
|
} else if (cur_c == '\\' && !backslash) {
|
||||||
/* We saw a backslash, and the previous character wasn't a
|
/* We saw a backslash, and the previous character wasn't a
|
||||||
backslash; escape the next character.
|
backslash; escape the next character.
|
||||||
|
|
||||||
|
@ -3771,7 +3791,7 @@ prefs_get_string_list(const gchar *str)
|
||||||
backslash = TRUE;
|
backslash = TRUE;
|
||||||
if (state == PRE_STRING)
|
if (state == PRE_STRING)
|
||||||
state = NOT_IN_QUOT;
|
state = NOT_IN_QUOT;
|
||||||
} else if (cur_c == ',' && state != IN_QUOT && ! backslash) {
|
} else if (cur_c == ',' && state != IN_QUOT && !backslash) {
|
||||||
/* We saw a comma, and we're not in the middle of a quoted string
|
/* We saw a comma, and we're not in the middle of a quoted string
|
||||||
and it wasn't preceded by a backslash; it's the end of
|
and it wasn't preceded by a backslash; it's the end of
|
||||||
the string we were working on... */
|
the string we were working on... */
|
||||||
|
@ -3966,7 +3986,7 @@ parse_column_format(fmt_data *cfmt, const char *fmt)
|
||||||
strncmp(fmt, cust_format, cust_format_len) == 0) {
|
strncmp(fmt, cust_format, cust_format_len) == 0) {
|
||||||
/* Yes. */
|
/* Yes. */
|
||||||
col_fmt = COL_CUSTOM;
|
col_fmt = COL_CUSTOM;
|
||||||
cust_format_info = g_strsplit(&fmt[cust_format_len+1],":",3); /* add 1 for ':' */
|
cust_format_info = g_strsplit(&fmt[cust_format_len+1], ":", 3); /* add 1 for ':' */
|
||||||
col_custom_fields = g_strdup(cust_format_info[0]);
|
col_custom_fields = g_strdup(cust_format_info[0]);
|
||||||
if (col_custom_fields && cust_format_info[1]) {
|
if (col_custom_fields && cust_format_info[1]) {
|
||||||
col_custom_occurrence = strtol(cust_format_info[1], &p, 10);
|
col_custom_occurrence = strtol(cust_format_info[1], &p, 10);
|
||||||
|
@ -4255,6 +4275,7 @@ reset_pref(pref_t *pref)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
reset_string_like_preference(pref);
|
reset_string_like_preference(pref);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -4774,6 +4795,12 @@ guint prefs_get_uint_value(const char *module_name, const char* pref_name)
|
||||||
return prefs_get_uint_value_real(prefs_find_preference(prefs_find_module(module_name), pref_name), pref_current);
|
return prefs_get_uint_value_real(prefs_find_preference(prefs_find_module(module_name), pref_name), pref_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* prefs_get_password_value(pref_t *pref, pref_source_t source)
|
||||||
|
{
|
||||||
|
return prefs_get_string_value(pref, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int prefs_set_uint_value(pref_t *pref, guint value, pref_source_t source)
|
unsigned int prefs_set_uint_value(pref_t *pref, guint value, pref_source_t source)
|
||||||
{
|
{
|
||||||
unsigned int changed = 0;
|
unsigned int changed = 0;
|
||||||
|
@ -4805,6 +4832,16 @@ unsigned int prefs_set_uint_value(pref_t *pref, guint value, pref_source_t sourc
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For use by UI code that sets preferences.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
prefs_set_password_value(pref_t *pref, const char* value, pref_source_t source)
|
||||||
|
{
|
||||||
|
return prefs_set_string_value(pref, value, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
guint prefs_get_uint_base(pref_t *pref)
|
guint prefs_get_uint_base(pref_t *pref)
|
||||||
{
|
{
|
||||||
return pref->info.base;
|
return pref->info.base;
|
||||||
|
@ -5940,6 +5977,11 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_,
|
||||||
containing_module->prefs_changed_flags |= prefs_set_string_value(pref, value, pref_current);
|
containing_module->prefs_changed_flags |= prefs_set_string_value(pref, value, pref_current);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
/* Read value is everytime empty */
|
||||||
|
containing_module->prefs_changed_flags |= prefs_set_string_value(pref, "", pref_current);
|
||||||
|
break;
|
||||||
|
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
{
|
{
|
||||||
if (!prefs_set_range_value_work(pref, value, return_range_errors,
|
if (!prefs_set_range_value_work(pref, value, return_range_errors,
|
||||||
|
@ -6124,6 +6166,10 @@ prefs_pref_type_name(pref_t *pref)
|
||||||
case PREF_UAT:
|
case PREF_UAT:
|
||||||
type_name = "UAT";
|
type_name = "UAT";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
type_name = "Password";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return type_name;
|
return type_name;
|
||||||
}
|
}
|
||||||
|
@ -6270,6 +6316,10 @@ prefs_pref_type_description(pref_t *pref)
|
||||||
type_desc = "Configuration data stored in its own file";
|
type_desc = "Configuration data stored in its own file";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
type_desc = "Password (never stored on disk)";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6315,6 +6365,7 @@ prefs_pref_is_default(pref_t *pref)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
if (!(g_strcmp0(pref->default_val.string, *pref->varp.string)))
|
if (!(g_strcmp0(pref->default_val.string, *pref->varp.string)))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -6469,6 +6520,9 @@ prefs_pref_to_str(pref_t *pref, pref_source_t source) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
return g_strdup(*(const char **) valp);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6524,14 +6578,15 @@ write_pref(gpointer data, gpointer user_data)
|
||||||
char *type_desc, *pref_text;
|
char *type_desc, *pref_text;
|
||||||
const char * def_prefix = prefs_pref_is_default(pref) ? "#" : "";
|
const char * def_prefix = prefs_pref_is_default(pref) ? "#" : "";
|
||||||
|
|
||||||
if (pref->type == PREF_CUSTOM) fprintf(arg->pf, "\n# %s", pref->custom_cbs.type_name_cb());
|
if (pref->type == PREF_CUSTOM)
|
||||||
|
fprintf(arg->pf, "\n# %s", pref->custom_cbs.type_name_cb());
|
||||||
fprintf(arg->pf, "\n");
|
fprintf(arg->pf, "\n");
|
||||||
if (pref->description &&
|
if (pref->description &&
|
||||||
(g_ascii_strncasecmp(pref->description,"", 2) != 0)) {
|
(g_ascii_strncasecmp(pref->description,"", 2) != 0)) {
|
||||||
if (pref->type != PREF_CUSTOM) {
|
if (pref->type != PREF_CUSTOM) {
|
||||||
/* We get duplicate lines otherwise. */
|
/* We get duplicate lines otherwise. */
|
||||||
|
|
||||||
desc_lines = g_strsplit(pref->description,"\n",0);
|
desc_lines = g_strsplit(pref->description, "\n", 0);
|
||||||
for (i = 0; desc_lines[i] != NULL; ++i) {
|
for (i = 0; desc_lines[i] != NULL; ++i) {
|
||||||
fprintf(arg->pf, "# %s\n", desc_lines[i]);
|
fprintf(arg->pf, "# %s\n", desc_lines[i]);
|
||||||
}
|
}
|
||||||
|
@ -6542,7 +6597,7 @@ write_pref(gpointer data, gpointer user_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
type_desc = prefs_pref_type_description(pref);
|
type_desc = prefs_pref_type_description(pref);
|
||||||
desc_lines = g_strsplit(type_desc,"\n",0);
|
desc_lines = g_strsplit(type_desc, "\n", 0);
|
||||||
for (i = 0; desc_lines[i] != NULL; ++i) {
|
for (i = 0; desc_lines[i] != NULL; ++i) {
|
||||||
fprintf(arg->pf, "# %s\n", desc_lines[i]);
|
fprintf(arg->pf, "# %s\n", desc_lines[i]);
|
||||||
}
|
}
|
||||||
|
@ -6551,12 +6606,19 @@ write_pref(gpointer data, gpointer user_data)
|
||||||
|
|
||||||
pref_text = prefs_pref_to_str(pref, pref_current);
|
pref_text = prefs_pref_to_str(pref, pref_current);
|
||||||
fprintf(arg->pf, "%s%s.%s: ", def_prefix, name_prefix, pref->name);
|
fprintf(arg->pf, "%s%s.%s: ", def_prefix, name_prefix, pref->name);
|
||||||
desc_lines = g_strsplit(pref_text,"\n",0);
|
if (pref->type != PREF_PASSWORD)
|
||||||
for (i = 0; desc_lines[i] != NULL; ++i) {
|
{
|
||||||
fprintf(arg->pf, "%s%s\n", i == 0 ? "" : def_prefix, desc_lines[i]);
|
desc_lines = g_strsplit(pref_text, "\n", 0);
|
||||||
|
for (i = 0; desc_lines[i] != NULL; ++i) {
|
||||||
|
fprintf(arg->pf, "%s%s\n", i == 0 ? "" : def_prefix, desc_lines[i]);
|
||||||
|
}
|
||||||
|
if (i == 0)
|
||||||
|
fprintf(arg->pf, "\n");
|
||||||
|
g_strfreev(desc_lines);
|
||||||
|
} else {
|
||||||
|
/* We never store password value */
|
||||||
|
fprintf(arg->pf, "\n");
|
||||||
}
|
}
|
||||||
if (i == 0) fprintf(arg->pf, "\n");
|
|
||||||
g_strfreev(desc_lines);
|
|
||||||
g_free(pref_text);
|
g_free(pref_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
19
epan/prefs.h
19
epan/prefs.h
|
@ -767,6 +767,25 @@ void prefs_register_decode_as_range_preference(module_t *module, const char *nam
|
||||||
void prefs_register_decode_as_preference(module_t *module, const char *name,
|
void prefs_register_decode_as_preference(module_t *module, const char *name,
|
||||||
const char *title, const char *description, guint *var);
|
const char *title, const char *description, guint *var);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a preference with an password (password is never stored).
|
||||||
|
* @param module the preferences module returned by prefs_register_protocol() or
|
||||||
|
* prefs_register_protocol_subtree()
|
||||||
|
* @param name the preference's identifier. This is appended to the name of the
|
||||||
|
* protocol, with a "." between them, to create a unique identifier.
|
||||||
|
* The identifier should not include the protocol name, as
|
||||||
|
* the preference file will already have it. Make sure that
|
||||||
|
* only lower-case ASCII letters, numbers, underscores and
|
||||||
|
* dots appear in the preference name.
|
||||||
|
* @param title the title in the preferences dialog
|
||||||
|
* @param description the description included in the preferences file
|
||||||
|
* and shown as tooltip in the GUI, or NULL
|
||||||
|
* @param var pointer to the storage location that is updated when the
|
||||||
|
* field is changed in the preference dialog box
|
||||||
|
*/
|
||||||
|
WS_DLL_PUBLIC void prefs_register_password_preference(module_t *module, const char *name,
|
||||||
|
const char *title, const char *description, const char **var);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a preference that used to be supported but no longer is.
|
* Register a preference that used to be supported but no longer is.
|
||||||
*
|
*
|
||||||
|
|
8
extcap.c
8
extcap.c
|
@ -883,8 +883,14 @@ static gboolean cb_preference(extcap_callback_info_t cb_info)
|
||||||
*arg->pref_valptr = arg->default_complex->_val;
|
*arg->pref_valptr = arg->default_complex->_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
prefs_register_string_preference(dev_module, pref_name_for_prefs,
|
if (arg->arg_type == EXTCAP_ARG_PASSWORD)
|
||||||
|
{
|
||||||
|
prefs_register_password_preference(dev_module, pref_name_for_prefs,
|
||||||
pref_title, pref_title, (const char **)arg->pref_valptr);
|
pref_title, pref_title, (const char **)arg->pref_valptr);
|
||||||
|
} else {
|
||||||
|
prefs_register_string_preference(dev_module, pref_name_for_prefs,
|
||||||
|
pref_title, pref_title, (const char **)arg->pref_valptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -524,9 +524,8 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
|
||||||
} else if (g_ascii_strcasecmp(param_value, "string") == 0) {
|
} else if (g_ascii_strcasecmp(param_value, "string") == 0) {
|
||||||
target_arg->arg_type = EXTCAP_ARG_STRING;
|
target_arg->arg_type = EXTCAP_ARG_STRING;
|
||||||
} else if (g_ascii_strcasecmp(param_value, "password") == 0) {
|
} else if (g_ascii_strcasecmp(param_value, "password") == 0) {
|
||||||
|
/* Password is never saved because is mapped to PREF_PASSWORD later */
|
||||||
target_arg->arg_type = EXTCAP_ARG_PASSWORD;
|
target_arg->arg_type = EXTCAP_ARG_PASSWORD;
|
||||||
/* default setting is to not save passwords */
|
|
||||||
target_arg->save = FALSE;
|
|
||||||
} else if (g_ascii_strcasecmp(param_value, "fileselect") == 0) {
|
} else if (g_ascii_strcasecmp(param_value, "fileselect") == 0) {
|
||||||
target_arg->arg_type = EXTCAP_ARG_FILESELECT;
|
target_arg->arg_type = EXTCAP_ARG_FILESELECT;
|
||||||
} else if (g_ascii_strcasecmp(param_value, "multicheck") == 0) {
|
} else if (g_ascii_strcasecmp(param_value, "multicheck") == 0) {
|
||||||
|
|
|
@ -4455,6 +4455,7 @@ sharkd_session_process_dumpconf_cb(pref_t *pref, gpointer d)
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
sharkd_json_value_string("s", prefs_get_string_value(pref, pref_current));
|
sharkd_json_value_string("s", prefs_get_string_value(pref, pref_current));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -4558,7 +4559,7 @@ sharkd_session_process_dumpconf_mod_cb(module_t *module, gpointer d)
|
||||||
* (o) u - preference value (for PREF_UINT, PREF_DECODE_AS_UINT)
|
* (o) u - preference value (for PREF_UINT, PREF_DECODE_AS_UINT)
|
||||||
* (o) ub - preference value suggested base for display (for PREF_UINT, PREF_DECODE_AS_UINT) and if different than 10
|
* (o) ub - preference value suggested base for display (for PREF_UINT, PREF_DECODE_AS_UINT) and if different than 10
|
||||||
* (o) b - preference value (only for PREF_BOOL) (1 true, 0 false)
|
* (o) b - preference value (only for PREF_BOOL) (1 true, 0 false)
|
||||||
* (o) s - preference value (for PREF_STRING, PREF_SAVE_FILENAME, PREF_OPEN_FILENAME, PREF_DIRNAME)
|
* (o) s - preference value (for PREF_STRING, PREF_SAVE_FILENAME, PREF_OPEN_FILENAME, PREF_DIRNAME, PREF_PASSWORD)
|
||||||
* (o) e - preference possible values (only for PREF_ENUM)
|
* (o) e - preference possible values (only for PREF_ENUM)
|
||||||
* (o) r - preference value (for PREF_RANGE, PREF_DECODE_AS_RANGE)
|
* (o) r - preference value (for PREF_RANGE, PREF_DECODE_AS_RANGE)
|
||||||
* (o) t - preference value (only for PREF_UAT)
|
* (o) t - preference value (only for PREF_UAT)
|
||||||
|
|
|
@ -299,6 +299,13 @@ my %APIs = (
|
||||||
|
|
||||||
my @apiGroups = qw(prohibited deprecated soft-deprecated);
|
my @apiGroups = qw(prohibited deprecated soft-deprecated);
|
||||||
|
|
||||||
|
# Defines array of pairs function/variable which are excluded
|
||||||
|
# from prefs_register_*_preference checks
|
||||||
|
my @excludePrefsCheck = (
|
||||||
|
[ qw(prefs_register_password_preference), '(const char **)arg->pref_valptr' ],
|
||||||
|
[ qw(prefs_register_string_preference), '(const char **)arg->pref_valptr' ],
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
# Given a ref to a hash containing "functions" and "functions_count" entries:
|
# Given a ref to a hash containing "functions" and "functions_count" entries:
|
||||||
# Determine if any item of the list of APIs contained in the array referenced by "functions"
|
# Determine if any item of the list of APIs contained in the array referenced by "functions"
|
||||||
|
@ -869,6 +876,7 @@ sub check_pref_var_dupes($$)
|
||||||
my @dupes;
|
my @dupes;
|
||||||
my %count;
|
my %count;
|
||||||
while ($filecontents =~ /prefs_register_(\w+?)_preference/gs) {
|
while ($filecontents =~ /prefs_register_(\w+?)_preference/gs) {
|
||||||
|
my ($func) = "prefs_register_$1_preference";
|
||||||
my ($args) = extract_bracketed(substr($filecontents, $+[0]), '()');
|
my ($args) = extract_bracketed(substr($filecontents, $+[0]), '()');
|
||||||
$args = substr($args, 1, -1); # strip parens
|
$args = substr($args, 1, -1); # strip parens
|
||||||
|
|
||||||
|
@ -876,7 +884,17 @@ sub check_pref_var_dupes($$)
|
||||||
next if exists $prefs_register_var_pos{$1} and not defined $pos;
|
next if exists $prefs_register_var_pos{$1} and not defined $pos;
|
||||||
$pos //= -1;
|
$pos //= -1;
|
||||||
my $var = (split /\s*,\s*(?![^(]*\))/, $args)[$pos]; # only commas outside parens
|
my $var = (split /\s*,\s*(?![^(]*\))/, $args)[$pos]; # only commas outside parens
|
||||||
push @dupes, $var if $count{$var}++ == 1;
|
|
||||||
|
my $ignore = 0;
|
||||||
|
for my $row (@excludePrefsCheck) {
|
||||||
|
my ($rfunc, $rvar) = @$row;
|
||||||
|
if (($rfunc eq $func) && ($rvar eq $var)) {
|
||||||
|
$ignore = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$ignore) {
|
||||||
|
push @dupes, $var if $count{$var}++ == 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (@dupes) {
|
if (@dupes) {
|
||||||
|
|
|
@ -85,11 +85,11 @@ prefs_store_ext_helper(const char * module_name, const char *pref_name, const ch
|
||||||
pref_t * pref = NULL;
|
pref_t * pref = NULL;
|
||||||
unsigned int pref_changed = 0;
|
unsigned int pref_changed = 0;
|
||||||
|
|
||||||
if ( ! prefs_is_registered_protocol(module_name))
|
if ( !prefs_is_registered_protocol(module_name))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
module = prefs_find_module(module_name);
|
module = prefs_find_module(module_name);
|
||||||
if ( ! module )
|
if ( !module )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pref = prefs_find_preference(module, pref_name);
|
pref = prefs_find_preference(module, pref_name);
|
||||||
|
@ -100,8 +100,13 @@ prefs_store_ext_helper(const char * module_name, const char *pref_name, const ch
|
||||||
if (prefs_get_type(pref) == PREF_STRING )
|
if (prefs_get_type(pref) == PREF_STRING )
|
||||||
{
|
{
|
||||||
pref_changed |= prefs_set_string_value(pref, pref_value, pref_stashed);
|
pref_changed |= prefs_set_string_value(pref, pref_value, pref_stashed);
|
||||||
if ( ! pref_changed || prefs_get_string_value(pref, pref_stashed) != 0 )
|
if ( !pref_changed || prefs_get_string_value(pref, pref_stashed) != 0 )
|
||||||
pref_changed |= prefs_set_string_value(pref, pref_value, pref_current);
|
pref_changed |= prefs_set_string_value(pref, pref_value, pref_current);
|
||||||
|
} else if (prefs_get_type(pref) == PREF_PASSWORD )
|
||||||
|
{
|
||||||
|
pref_changed |= prefs_set_password_value(pref, pref_value, pref_stashed);
|
||||||
|
if ( !pref_changed || prefs_get_password_value(pref, pref_stashed) != 0 )
|
||||||
|
pref_changed |= prefs_set_password_value(pref, pref_value, pref_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pref_changed;
|
return pref_changed;
|
||||||
|
@ -128,11 +133,11 @@ prefs_store_ext_multiple(const char * module, GHashTable * pref_values)
|
||||||
gboolean pref_changed = FALSE;
|
gboolean pref_changed = FALSE;
|
||||||
GList * keys = NULL;
|
GList * keys = NULL;
|
||||||
|
|
||||||
if ( ! prefs_is_registered_protocol(module))
|
if ( !prefs_is_registered_protocol(module))
|
||||||
return pref_changed;
|
return pref_changed;
|
||||||
|
|
||||||
keys = g_hash_table_get_keys(pref_values);
|
keys = g_hash_table_get_keys(pref_values);
|
||||||
if ( ! keys )
|
if ( !keys )
|
||||||
return pref_changed;
|
return pref_changed;
|
||||||
|
|
||||||
for ( GList * key = keys; key != NULL; key = g_list_next(key) )
|
for ( GList * key = keys; key != NULL; key = g_list_next(key) )
|
||||||
|
|
|
@ -442,7 +442,7 @@ QWidget * ExtArgText::createEditor(QWidget * parent)
|
||||||
textBox->setPlaceholderText(QString().fromUtf8(_argument->placeholder));
|
textBox->setPlaceholderText(QString().fromUtf8(_argument->placeholder));
|
||||||
|
|
||||||
if (_argument->arg_type == EXTCAP_ARG_PASSWORD)
|
if (_argument->arg_type == EXTCAP_ARG_PASSWORD)
|
||||||
textBox->setEchoMode(QLineEdit::Password);
|
textBox->setEchoMode(QLineEdit::PasswordEchoOnEdit);
|
||||||
|
|
||||||
connect(textBox , SIGNAL(textChanged(QString)), SLOT(onStringChanged(QString)));
|
connect(textBox , SIGNAL(textChanged(QString)), SLOT(onStringChanged(QString)));
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,20 @@ public:
|
||||||
REGISTER_PREFERENCE_TYPE(PREF_STRING, StringPreference)
|
REGISTER_PREFERENCE_TYPE(PREF_STRING, StringPreference)
|
||||||
REGISTER_PREFERENCE_TYPE(PREF_CUSTOM, StringPreference)
|
REGISTER_PREFERENCE_TYPE(PREF_CUSTOM, StringPreference)
|
||||||
|
|
||||||
|
class PasswordPreference : public StringPreference
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PasswordPreference(QObject * parent = Q_NULLPTR) : StringPreference(parent) {}
|
||||||
|
virtual QWidget * editor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)
|
||||||
|
{
|
||||||
|
QLineEdit *le = static_cast<QLineEdit *>(StringPreference::editor(parent, option, index));
|
||||||
|
|
||||||
|
le->setEchoMode(QLineEdit::PasswordEchoOnEdit);
|
||||||
|
return le;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
REGISTER_PREFERENCE_TYPE(PREF_PASSWORD, PasswordPreference)
|
||||||
|
|
||||||
class UIntPreference : public StringPreference
|
class UIntPreference : public StringPreference
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <QFont>
|
#include <QFont>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
// XXX Should we move this to ui/preference_utils?
|
// XXX Should we move this to ui/preference_utils?
|
||||||
static GHashTable * pref_ptr_to_pref_ = NULL;
|
static GHashTable * pref_ptr_to_pref_ = NULL;
|
||||||
|
@ -341,7 +342,8 @@ QString PrefsModel::typeToString(int type)
|
||||||
|
|
||||||
AdvancedPrefsModel::AdvancedPrefsModel(QObject * parent)
|
AdvancedPrefsModel::AdvancedPrefsModel(QObject * parent)
|
||||||
: QSortFilterProxyModel(parent),
|
: QSortFilterProxyModel(parent),
|
||||||
filter_()
|
filter_(),
|
||||||
|
passwordChar_(QApplication::style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,7 +402,12 @@ QVariant AdvancedPrefsModel::data(const QModelIndex &dataindex, int role) const
|
||||||
if (item->getPref() == NULL)
|
if (item->getPref() == NULL)
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
return sourceModel()->data(sourceModel()->index(modelIndex.row(), PrefsModel::colValue, modelIndex.parent()), role);
|
if (PREF_PASSWORD == item->getPrefType())
|
||||||
|
{
|
||||||
|
return QString(sourceModel()->data(sourceModel()->index(modelIndex.row(), PrefsModel::colValue, modelIndex.parent()), role).toString().size(), passwordChar_);
|
||||||
|
} else {
|
||||||
|
return sourceModel()->data(sourceModel()->index(modelIndex.row(), PrefsModel::colValue, modelIndex.parent()), role);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -497,6 +504,9 @@ bool AdvancedPrefsModel::setData(const QModelIndex &dataindex, const QVariant &v
|
||||||
case PREF_STRING:
|
case PREF_STRING:
|
||||||
prefs_set_string_value(item->getPref(), value.toString().toStdString().c_str(), pref_stashed);
|
prefs_set_string_value(item->getPref(), value.toString().toStdString().c_str(), pref_stashed);
|
||||||
break;
|
break;
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
prefs_set_password_value(item->getPref(), value.toString().toStdString().c_str(), pref_stashed);
|
||||||
|
break;
|
||||||
case PREF_DECODE_AS_RANGE:
|
case PREF_DECODE_AS_RANGE:
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
prefs_set_stashed_range_value(item->getPref(), value.toString().toUtf8().constData());
|
prefs_set_stashed_range_value(item->getPref(), value.toString().toUtf8().constData());
|
||||||
|
|
|
@ -127,6 +127,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QString filter_;
|
QString filter_;
|
||||||
|
const QChar passwordChar_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ModulePrefsModel : public QSortFilterProxyModel
|
class ModulePrefsModel : public QSortFilterProxyModel
|
||||||
|
|
|
@ -143,6 +143,22 @@ pref_show(pref_t *pref, gpointer layout_ptr)
|
||||||
vb->addLayout(hb);
|
vb->addLayout(hb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
{
|
||||||
|
QHBoxLayout *hb = new QHBoxLayout();
|
||||||
|
QLabel *label = new QLabel(prefs_get_title(pref));
|
||||||
|
label->setToolTip(tooltip);
|
||||||
|
hb->addWidget(label);
|
||||||
|
QLineEdit *string_le = new QLineEdit();
|
||||||
|
string_le->setToolTip(tooltip);
|
||||||
|
string_le->setProperty(pref_prop_, VariantPointer<pref_t>::asQVariant(pref));
|
||||||
|
string_le->setMinimumWidth(string_le->fontMetrics().height() * 20);
|
||||||
|
string_le->setEchoMode(QLineEdit::PasswordEchoOnEdit);
|
||||||
|
hb->addWidget(string_le);
|
||||||
|
hb->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum));
|
||||||
|
vb->addLayout(hb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PREF_DECODE_AS_RANGE:
|
case PREF_DECODE_AS_RANGE:
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
{
|
{
|
||||||
|
@ -256,6 +272,7 @@ ModulePreferencesScrollArea::ModulePreferencesScrollArea(module_t *module, QWidg
|
||||||
case PREF_SAVE_FILENAME:
|
case PREF_SAVE_FILENAME:
|
||||||
case PREF_OPEN_FILENAME:
|
case PREF_OPEN_FILENAME:
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
|
case PREF_PASSWORD:
|
||||||
connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::stringLineEditTextEdited);
|
connect(le, &QLineEdit::textEdited, this, &ModulePreferencesScrollArea::stringLineEditTextEdited);
|
||||||
break;
|
break;
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
|
|
|
@ -98,6 +98,7 @@ void PreferenceEditorFrame::editPreference(preference *pref, pref_module *module
|
||||||
browse_button = true;
|
browse_button = true;
|
||||||
// Fallthrough
|
// Fallthrough
|
||||||
case PREF_STRING:
|
case PREF_STRING:
|
||||||
|
case PREF_PASSWORD:
|
||||||
connect(ui->preferenceLineEdit, &SyntaxLineEdit::textChanged,
|
connect(ui->preferenceLineEdit, &SyntaxLineEdit::textChanged,
|
||||||
this, &PreferenceEditorFrame::stringLineEditTextEdited);
|
this, &PreferenceEditorFrame::stringLineEditTextEdited);
|
||||||
show = true;
|
show = true;
|
||||||
|
@ -225,6 +226,9 @@ void PreferenceEditorFrame::on_buttonBox_accepted()
|
||||||
case PREF_DIRNAME:
|
case PREF_DIRNAME:
|
||||||
apply = prefs_set_string_value(pref_, new_str_.toStdString().c_str(), pref_stashed);
|
apply = prefs_set_string_value(pref_, new_str_.toStdString().c_str(), pref_stashed);
|
||||||
break;
|
break;
|
||||||
|
case PREF_PASSWORD:
|
||||||
|
apply = prefs_set_password_value(pref_, new_str_.toStdString().c_str(), pref_stashed);
|
||||||
|
break;
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
case PREF_DECODE_AS_RANGE:
|
case PREF_DECODE_AS_RANGE:
|
||||||
apply = prefs_set_range_value(pref_, new_range_, pref_stashed);
|
apply = prefs_set_range_value(pref_, new_range_, pref_stashed);
|
||||||
|
|
|
@ -237,6 +237,7 @@ void ProtocolPreferencesMenu::addMenuItem(preference *pref)
|
||||||
case PREF_RANGE:
|
case PREF_RANGE:
|
||||||
case PREF_DECODE_AS_UINT:
|
case PREF_DECODE_AS_UINT:
|
||||||
case PREF_DECODE_AS_RANGE:
|
case PREF_DECODE_AS_RANGE:
|
||||||
|
case PREF_PASSWORD:
|
||||||
{
|
{
|
||||||
EditorPreferenceAction *epa = new EditorPreferenceAction(pref, this);
|
EditorPreferenceAction *epa = new EditorPreferenceAction(pref, this);
|
||||||
addAction(epa);
|
addAction(epa);
|
||||||
|
|
Loading…
Reference in New Issue