mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
Added HttpOnly cookies
This commit is contained in:
parent
6f001ea50f
commit
9eaf03cf2a
@ -454,13 +454,14 @@ set_cookie(struct uri *uri, unsigned char *str)
|
|||||||
|
|
||||||
cookie->secure = (parse_header_param(str, "secure", NULL, 0)
|
cookie->secure = (parse_header_param(str, "secure", NULL, 0)
|
||||||
== HEADER_PARAM_FOUND);
|
== HEADER_PARAM_FOUND);
|
||||||
|
cookie->httponly = (parse_header_param(str, "httponly", NULL, 0)
|
||||||
|
== HEADER_PARAM_FOUND);
|
||||||
#ifdef DEBUG_COOKIES
|
#ifdef DEBUG_COOKIES
|
||||||
{
|
{
|
||||||
DBG("Got cookie %s = %s from %s, domain %s, "
|
DBG("Got cookie %s = %s from %s, domain %s, "
|
||||||
"expires at %"TIME_PRINT_FORMAT", secure %d", cookie->name,
|
"expires at %"TIME_PRINT_FORMAT", secure %d, httponly %d", cookie->name,
|
||||||
cookie->value, cookie->server->host, cookie->domain,
|
cookie->value, cookie->server->host, cookie->domain,
|
||||||
(time_print_T) cookie->expires, cookie->secure);
|
(time_print_T) cookie->expires, cookie->secure, cookie->httponly);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -618,8 +619,8 @@ is_path_prefix(unsigned char *d, unsigned char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct string *
|
static struct string *
|
||||||
send_cookies(struct uri *uri)
|
send_cookies_common(struct uri *uri, unsigned int httponly)
|
||||||
{
|
{
|
||||||
struct c_domain *cd;
|
struct c_domain *cd;
|
||||||
struct cookie *c, *next;
|
struct cookie *c, *next;
|
||||||
@ -661,6 +662,9 @@ send_cookies(struct uri *uri)
|
|||||||
if (c->secure && uri->protocol != PROTOCOL_HTTPS)
|
if (c->secure && uri->protocol != PROTOCOL_HTTPS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (c->httponly && httponly)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (header.length)
|
if (header.length)
|
||||||
add_to_string(&header, "; ");
|
add_to_string(&header, "; ");
|
||||||
|
|
||||||
@ -682,6 +686,18 @@ send_cookies(struct uri *uri)
|
|||||||
return &header;
|
return &header;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct string *
|
||||||
|
send_cookies(struct uri *uri)
|
||||||
|
{
|
||||||
|
return send_cookies_common(uri, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string *
|
||||||
|
send_cookies_js(struct uri *uri)
|
||||||
|
{
|
||||||
|
return send_cookies_common(uri, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static void done_cookies(struct module *module);
|
static void done_cookies(struct module *module);
|
||||||
|
|
||||||
|
|
||||||
@ -719,7 +735,7 @@ load_cookies(void) {
|
|||||||
while (fgets(in_buffer, 6 * MAX_STR_LEN, fp)) {
|
while (fgets(in_buffer, 6 * MAX_STR_LEN, fp)) {
|
||||||
struct cookie *cookie;
|
struct cookie *cookie;
|
||||||
unsigned char *p, *q = in_buffer;
|
unsigned char *p, *q = in_buffer;
|
||||||
enum { NAME = 0, VALUE, SERVER, PATH, DOMAIN, EXPIRES, SECURE, MEMBERS };
|
enum { NAME = 0, VALUE, SERVER, PATH, DOMAIN, EXPIRES, SECURE, HTTPONLY, MEMBERS };
|
||||||
int member;
|
int member;
|
||||||
struct {
|
struct {
|
||||||
unsigned char *pos;
|
unsigned char *pos;
|
||||||
@ -740,7 +756,7 @@ load_cookies(void) {
|
|||||||
members[member].len = p - q;
|
members[member].len = p - q;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (member != MEMBERS) continue; /* Invalid line. */
|
if ((member != HTTPONLY) && (member != MEMBERS)) continue; /* Invalid line. */
|
||||||
|
|
||||||
/* Skip expired cookies if any. */
|
/* Skip expired cookies if any. */
|
||||||
expires = str_to_time_t(members[EXPIRES].pos);
|
expires = str_to_time_t(members[EXPIRES].pos);
|
||||||
@ -768,6 +784,7 @@ load_cookies(void) {
|
|||||||
|
|
||||||
cookie->expires = expires;
|
cookie->expires = expires;
|
||||||
cookie->secure = !!atoi(members[SECURE].pos);
|
cookie->secure = !!atoi(members[SECURE].pos);
|
||||||
|
cookie->httponly = (member == MEMBERS) && !!atoi(members[HTTPONLY].pos);
|
||||||
|
|
||||||
accept_cookie(cookie);
|
accept_cookie(cookie);
|
||||||
}
|
}
|
||||||
@ -857,12 +874,12 @@ save_cookies(struct terminal *term) {
|
|||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
foreach (c, cookies) {
|
foreach (c, cookies) {
|
||||||
if (!c->expires || c->expires <= now) continue;
|
if (!c->expires || c->expires <= now) continue;
|
||||||
if (secure_fprintf(ssi, "%s\t%s\t%s\t%s\t%s\t%"TIME_PRINT_FORMAT"\t%d\n",
|
if (secure_fprintf(ssi, "%s\t%s\t%s\t%s\t%s\t%"TIME_PRINT_FORMAT"\t%d\t%d\n",
|
||||||
c->name, c->value,
|
c->name, c->value,
|
||||||
c->server->host,
|
c->server->host,
|
||||||
empty_string_or_(c->path),
|
empty_string_or_(c->path),
|
||||||
empty_string_or_(c->domain),
|
empty_string_or_(c->domain),
|
||||||
(time_print_T) c->expires, c->secure) < 0)
|
(time_print_T) c->expires, c->secure, c->httponly) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,8 @@ struct cookie {
|
|||||||
|
|
||||||
struct cookie_server *server; /* The host the cookie originated from */
|
struct cookie_server *server; /* The host the cookie originated from */
|
||||||
time_t expires; /* Expiration time. Zero means undefined */
|
time_t expires; /* Expiration time. Zero means undefined */
|
||||||
int secure; /* Did it have 'secure' attribute */
|
unsigned int secure:1; /* Did it have 'secure' attribute */
|
||||||
|
unsigned int httponly:1; /* Did it have 'httponly' attribute */
|
||||||
|
|
||||||
struct listbox_item *box_item;
|
struct listbox_item *box_item;
|
||||||
};
|
};
|
||||||
@ -61,6 +62,7 @@ void set_cookies_dirty(void);
|
|||||||
* string will be overwritten at the next call time. The string source
|
* string will be overwritten at the next call time. The string source
|
||||||
* itself is dynamically allocated, though. */
|
* itself is dynamically allocated, though. */
|
||||||
struct string *send_cookies(struct uri *uri);
|
struct string *send_cookies(struct uri *uri);
|
||||||
|
struct string *send_cookies_js(struct uri *uri);
|
||||||
|
|
||||||
extern struct module cookies_module;
|
extern struct module cookies_module;
|
||||||
|
|
||||||
|
@ -48,6 +48,8 @@ add_cookie_info_to_string(struct string *string, struct cookie *cookie,
|
|||||||
|
|
||||||
add_format_to_string(string, "\n%s: %s", _("Secure", term),
|
add_format_to_string(string, "\n%s: %s", _("Secure", term),
|
||||||
_(cookie->secure ? N_("yes") : N_("no"), term));
|
_(cookie->secure ? N_("yes") : N_("no"), term));
|
||||||
|
add_format_to_string(string, "\n%s: %s", _("HttpOnly", term),
|
||||||
|
_(cookie->httponly ? N_("yes") : N_("no"), term));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -321,13 +323,33 @@ set_cookie_secure(struct dialog_data *dlg_data, struct widget_data *widget_data)
|
|||||||
return EVENT_PROCESSED;
|
return EVENT_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static widget_handler_status_T
|
||||||
|
set_cookie_httponly(struct dialog_data *dlg_data, struct widget_data *widget_data)
|
||||||
|
{
|
||||||
|
struct cookie *cookie = dlg_data->dlg->udata;
|
||||||
|
unsigned char *value = widget_data->cdata;
|
||||||
|
unsigned char *end;
|
||||||
|
long number;
|
||||||
|
|
||||||
|
if (!value || !cookie) return EVENT_NOT_PROCESSED;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
number = strtol(value, (char **) &end, 10);
|
||||||
|
if (errno || *end) return EVENT_NOT_PROCESSED;
|
||||||
|
|
||||||
|
cookie->httponly = (number != 0);
|
||||||
|
set_cookies_dirty();
|
||||||
|
return EVENT_PROCESSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
build_edit_dialog(struct terminal *term, struct cookie *cookie)
|
build_edit_dialog(struct terminal *term, struct cookie *cookie)
|
||||||
{
|
{
|
||||||
#define EDIT_WIDGETS_COUNT 8
|
#define EDIT_WIDGETS_COUNT 9
|
||||||
/* [gettext_accelerator_context(.build_edit_dialog)] */
|
/* [gettext_accelerator_context(.build_edit_dialog)] */
|
||||||
struct dialog *dlg;
|
struct dialog *dlg;
|
||||||
unsigned char *name, *value, *domain, *expires, *secure;
|
unsigned char *name, *value, *domain, *expires, *secure, *httponly;
|
||||||
unsigned char *dlg_server;
|
unsigned char *dlg_server;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
|
||||||
@ -344,6 +366,7 @@ build_edit_dialog(struct terminal *term, struct cookie *cookie)
|
|||||||
domain = value + MAX_STR_LEN;
|
domain = value + MAX_STR_LEN;
|
||||||
expires = domain + MAX_STR_LEN;
|
expires = domain + MAX_STR_LEN;
|
||||||
secure = expires + MAX_STR_LEN;
|
secure = expires + MAX_STR_LEN;
|
||||||
|
httponly = secure + MAX_STR_LEN;
|
||||||
|
|
||||||
safe_strncpy(name, cookie->name, MAX_STR_LEN);
|
safe_strncpy(name, cookie->name, MAX_STR_LEN);
|
||||||
safe_strncpy(value, cookie->value, MAX_STR_LEN);
|
safe_strncpy(value, cookie->value, MAX_STR_LEN);
|
||||||
@ -352,6 +375,8 @@ build_edit_dialog(struct terminal *term, struct cookie *cookie)
|
|||||||
ulongcat(expires, &length, cookie->expires, MAX_STR_LEN, 0);
|
ulongcat(expires, &length, cookie->expires, MAX_STR_LEN, 0);
|
||||||
length = 0;
|
length = 0;
|
||||||
ulongcat(secure, &length, cookie->secure, MAX_STR_LEN, 0);
|
ulongcat(secure, &length, cookie->secure, MAX_STR_LEN, 0);
|
||||||
|
length = 0;
|
||||||
|
ulongcat(httponly, &length, cookie->httponly, MAX_STR_LEN, 0);
|
||||||
|
|
||||||
dlg_server = cookie->server->host;
|
dlg_server = cookie->server->host;
|
||||||
dlg_server = straconcat(_("Server", term), ": ", dlg_server, "\n",
|
dlg_server = straconcat(_("Server", term), ": ", dlg_server, "\n",
|
||||||
@ -368,6 +393,7 @@ build_edit_dialog(struct terminal *term, struct cookie *cookie)
|
|||||||
add_dlg_field_float(dlg, _("Domain", term), 0, 0, set_cookie_domain, MAX_STR_LEN, domain, NULL);
|
add_dlg_field_float(dlg, _("Domain", term), 0, 0, set_cookie_domain, MAX_STR_LEN, domain, NULL);
|
||||||
add_dlg_field_float(dlg, _("Expires", term), 0, 0, set_cookie_expires, MAX_STR_LEN, expires, NULL);
|
add_dlg_field_float(dlg, _("Expires", term), 0, 0, set_cookie_expires, MAX_STR_LEN, expires, NULL);
|
||||||
add_dlg_field_float(dlg, _("Secure", term), 0, 0, set_cookie_secure, MAX_STR_LEN, secure, NULL);
|
add_dlg_field_float(dlg, _("Secure", term), 0, 0, set_cookie_secure, MAX_STR_LEN, secure, NULL);
|
||||||
|
add_dlg_field_float(dlg, _("HttpOnly", term), 0, 0, set_cookie_httponly, MAX_STR_LEN, httponly, NULL);
|
||||||
|
|
||||||
add_dlg_button(dlg, _("~OK", term), B_ENTER, ok_dialog, NULL);
|
add_dlg_button(dlg, _("~OK", term), B_ENTER, ok_dialog, NULL);
|
||||||
add_dlg_button(dlg, _("~Cancel", term), B_ESC, cancel_dialog, NULL);
|
add_dlg_button(dlg, _("~Cancel", term), B_ESC, cancel_dialog, NULL);
|
||||||
|
@ -110,7 +110,7 @@ document_get_property(JSContext *ctx, JSObject *obj, jsid id, jsval *vp)
|
|||||||
|
|
||||||
#ifdef CONFIG_COOKIES
|
#ifdef CONFIG_COOKIES
|
||||||
if (!strcmp(string, "cookie")) {
|
if (!strcmp(string, "cookie")) {
|
||||||
struct string *cookies = send_cookies(vs->uri);
|
struct string *cookies = send_cookies_js(vs->uri);
|
||||||
|
|
||||||
if (cookies) {
|
if (cookies) {
|
||||||
static unsigned char cookiestr[1024];
|
static unsigned char cookiestr[1024];
|
||||||
|
Loading…
Reference in New Issue
Block a user