From 11d2921bbfca6c00ec1d68bdb6ddd25beacbec3d Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 9 Sep 2016 10:56:11 +0100 Subject: improve cookie time display and document locale interaction --- desktop/cookie_manager.c | 125 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 86 insertions(+), 39 deletions(-) (limited to 'desktop') diff --git a/desktop/cookie_manager.c b/desktop/cookie_manager.c index b0c48a7fc..3f48dad5c 100644 --- a/desktop/cookie_manager.c +++ b/desktop/cookie_manager.c @@ -16,8 +16,19 @@ * along with this program. If not, see . */ -/** \file - * Cookie Manager (implementation). +/** + * \file + * Implementation of Cookie Management + * + * This allows users to view and remove their web cookies. + * + * \todo the viewing of cookies is pretty basic and it would be good + * to apply more processing of the values and perhaps top level domain + * suffix highlighting to give a better user information as to how the + * cookies interact with the users sessions. + * + * \todo In addition to removing cookies it might be useful to allow + * users to edit them, especially to alter expiry times. */ @@ -205,10 +216,10 @@ static void cookie_manager_free_treeview_field_data( * \param value Text to set in field, ownership yielded * \return NSERROR_OK on success, appropriate error otherwise */ -static inline nserror cookie_manager_field_builder( - enum cookie_manager_field field, - struct treeview_field_data *data, - const char *value) +static inline nserror +cookie_manager_field_builder(enum cookie_manager_field field, + struct treeview_field_data *data, + const char *value) { data->field = cm_ctx.fields[field].field; data->value = value; @@ -217,6 +228,46 @@ static inline nserror cookie_manager_field_builder( return NSERROR_OK; } +/** + * Build a cookie manager treeview field from given time + * + * The time should be converted to text in the users locacle + * + * \todo This should probably generate the user text using localtime + * and strftime with the c format specifier. Currently ctime will + * always generate output in the C locale. + * + * \param field Cookie manager treeview field to build + * \param fdata Cookie manager entry field data to set + * \param value Time to show in field + * \return NSERROR_OK on success, appropriate error otherwise + */ +static inline nserror +cookie_manager_field_builder_time(enum cookie_manager_field field, + struct treeview_field_data *fdata, + const time_t *value) +{ + const char *date; + char *date2; + + fdata->field = cm_ctx.fields[field].field; + + date = ctime(value); + date2 = strdup(date); + if (date2 == NULL) { + fdata->value = NULL; + fdata->value_len = 0; + } else { + assert(date2[24] == '\n'); + date2[24] = '\0'; + + fdata->value = date2; + fdata->value_len = strlen(date2); + } + + return NSERROR_OK; +} + /** * Set a cookie manager entry's data from the cookie_data. @@ -225,13 +276,10 @@ static inline nserror cookie_manager_field_builder( * \param data Data associated with entry's cookie * \return NSERROR_OK on success, appropriate error otherwise */ -static nserror cookie_manager_set_treeview_field_data( - struct cookie_manager_entry *e, - const struct cookie_data *data) +static nserror +cookie_manager_set_treeview_field_data(struct cookie_manager_entry *e, + const struct cookie_data *data) { - const char *date; - char *date2; - assert(e != NULL); assert(data != NULL); @@ -246,53 +294,45 @@ static nserror cookie_manager_set_treeview_field_data( &e->data[COOKIE_M_PATH], strdup(data->path)); /* Set the Expires date field */ - date = ctime(&data->expires); - date2 = strdup(date); - if (date2 != NULL) { - assert(date2[24] == '\n'); - date2[24] = '\0'; - } - cookie_manager_field_builder(COOKIE_M_EXPIRES, - &e->data[COOKIE_M_EXPIRES], date2); + cookie_manager_field_builder_time(COOKIE_M_EXPIRES, + &e->data[COOKIE_M_EXPIRES], &data->expires); /* Set the Last used date field */ - date = ctime(&data->last_used); - date2 = strdup(date); - if (date2 != NULL) { - assert(date2[24] == '\n'); - date2[24] = '\0'; - } - cookie_manager_field_builder(COOKIE_M_LAST_USED, - &e->data[COOKIE_M_LAST_USED], date2); + cookie_manager_field_builder_time(COOKIE_M_LAST_USED, + &e->data[COOKIE_M_LAST_USED], &data->last_used); /* Set the Restrictions text */ - if (data->secure && data->http_only) + if (data->secure && data->http_only) { e->data[COOKIE_M_RESTRICTIONS] = cm_ctx.values[COOKIE_M_HTTPS]; - else if (data->secure) + } else if (data->secure) { e->data[COOKIE_M_RESTRICTIONS] = cm_ctx.values[COOKIE_M_SECURE]; - else if (data->http_only) + } else if (data->http_only) { e->data[COOKIE_M_RESTRICTIONS] = cm_ctx.values[COOKIE_M_HTTP]; - else + } else { e->data[COOKIE_M_RESTRICTIONS] = cm_ctx.values[COOKIE_M_NONE]; + } /* Set the Version text */ switch (data->version) { case COOKIE_NETSCAPE: e->data[COOKIE_M_VERSION] = cm_ctx.values[COOKIE_M_NETSCAPE]; break; + case COOKIE_RFC2109: e->data[COOKIE_M_VERSION] = cm_ctx.values[COOKIE_M_RFC2109]; break; + case COOKIE_RFC2965: e->data[COOKIE_M_VERSION] = cm_ctx.values[COOKIE_M_RFC2965]; break; } /* Set the Persistent text */ - if (data->no_destroy) + if (data->no_destroy) { e->data[COOKIE_M_PERSISTENT] = cm_ctx.values[COOKIE_M_YES]; - else + } else { e->data[COOKIE_M_PERSISTENT] = cm_ctx.values[COOKIE_M_NO]; + } return NSERROR_OK; } @@ -329,10 +369,13 @@ static nserror cookie_manager_create_cookie_node( return err; } - err = treeview_create_node_entry(cm_ctx.tree, &(cookie->entry), - parent->folder, TREE_REL_FIRST_CHILD, - cookie->data, cookie, - cm_ctx.built ? TREE_OPTION_NONE : + err = treeview_create_node_entry(cm_ctx.tree, + &(cookie->entry), + parent->folder, + TREE_REL_FIRST_CHILD, + cookie->data, + cookie, + cm_ctx.built ? TREE_OPTION_NONE : TREE_OPTION_SUPPRESS_RESIZE | TREE_OPTION_SUPPRESS_REDRAW); if (err != NSERROR_OK) { @@ -677,7 +720,7 @@ static nserror cookie_manager_init_common_values(void) /** * Delete cookie manager entries (and optionally delete from urldb) * - * \param e Cookie manager entry to delete. + * \param e Cookie manager entry to delete. */ static void cookie_manager_delete_entry(struct cookie_manager_entry *e) { @@ -724,6 +767,8 @@ static nserror cookie_manager_tree_node_folder_cb( return NSERROR_OK; } + + static nserror cookie_manager_tree_node_entry_cb( struct treeview_node_msg msg, void *data) { @@ -744,6 +789,8 @@ static nserror cookie_manager_tree_node_entry_cb( } return NSERROR_OK; } + + struct treeview_callback_table cm_tree_cb_t = { .folder = cookie_manager_tree_node_folder_cb, .entry = cookie_manager_tree_node_entry_cb -- cgit v1.2.3