Gitweb links:
...log
http://git.netsurf-browser.org/netsurf.git/shortlog/60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5
...commit
http://git.netsurf-browser.org/netsurf.git/commit/60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5
...tree
http://git.netsurf-browser.org/netsurf.git/tree/60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5
The branch, tlsa/401 has been created
at 60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5 (commit)
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5
commit 60d40bb8e3fcee4b018e6c286c6b201d9b1d99b5
Author: Michael Drake <[email protected]>
Commit: Michael Drake <[email protected]>
GTK: Update for new HTTP auth API.
diff --git a/frontends/gtk/login.c b/frontends/gtk/login.c
index 91d8b37..83253a5 100644
--- a/frontends/gtk/login.c
+++ b/frontends/gtk/login.c
@@ -32,7 +32,9 @@ struct session_401 {
nsurl *url; /**< URL being fetched */
lwc_string *host; /**< Host for user display */
char *realm; /**< Authentication realm */
- nserror (*cb)(bool proceed, void *pw); /**< Continuation callback */
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw); /**< Continuation callback */
void *cbpw; /**< Continuation data */
GtkBuilder *x; /**< Our builder windows */
GtkWindow *wnd; /**< The login window itself */
@@ -83,14 +85,8 @@ static void nsgtk_login_ok_clicked(GtkButton *w, gpointer
data)
struct session_401 *session = (struct session_401 *)data;
const gchar *user = gtk_entry_get_text(session->user);
const gchar *pass = gtk_entry_get_text(session->pass);
- char *auth;
- auth = malloc(strlen(user) + strlen(pass) + 2);
- sprintf(auth, "%s:%s", user, pass);
- urldb_set_auth_details(session->url, session->realm, auth);
- free(auth);
-
- session->cb(true, session->cbpw);
+ session->cb(user, pass, session->cbpw);
destroy_login_window(session);
}
@@ -106,7 +102,7 @@ static void nsgtk_login_cancel_clicked(GtkButton *w,
gpointer data)
{
struct session_401 *session = (struct session_401 *) data;
- session->cb(false, session->cbpw);
+ session->cb(NULL, NULL, session->cbpw);
/* close and destroy the window */
destroy_login_window(session);
@@ -128,10 +124,12 @@ static void nsgtk_login_cancel_clicked(GtkButton *w,
gpointer data)
*/
static nserror
create_login_window(nsurl *url,
- lwc_string *host,
- const char *realm,
- nserror (*cb)(bool proceed, void *pw),
- void *cbpw)
+ lwc_string *host, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw)
{
struct session_401 *session;
GtkWindow *wnd;
@@ -177,8 +175,8 @@ create_login_window(nsurl *url,
gtk_label_set_text(GTK_LABEL(lhost), lwc_string_data(host));
gtk_label_set_text(lrealm, realm);
- gtk_entry_set_text(euser, "");
- gtk_entry_set_text(epass, "");
+ gtk_entry_set_text(euser, username);
+ gtk_entry_set_text(epass, password);
/* attach signal handlers to the Login and Cancel buttons in our new
* window to call functions in this file to process the login
@@ -209,10 +207,12 @@ create_login_window(nsurl *url,
/* exported function documented in gtk/login.h */
-void gui_401login_open(nsurl *url,
- const char *realm,
- nserror (*cb)(bool proceed, void *pw),
- void *cbpw)
+nserror gui_401login_open(nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw)
{
lwc_string *host;
nserror res;
@@ -220,13 +220,15 @@ void gui_401login_open(nsurl *url,
host = nsurl_get_component(url, NSURL_HOST);
assert(host != NULL);
- res = create_login_window(url, host, realm, cb, cbpw);
+ res = create_login_window(url, host, realm, username, password,
+ cb, cbpw);
if (res != NSERROR_OK) {
NSLOG(netsurf, INFO, "Login init failed");
- /* creating login failed so cancel navigation */
- cb(false, cbpw);
+ return res;
}
lwc_string_unref(host);
+
+ return NSERROR_OK;
}
diff --git a/frontends/gtk/login.h b/frontends/gtk/login.h
index 00c2900..1be1b4c 100644
--- a/frontends/gtk/login.h
+++ b/frontends/gtk/login.h
@@ -26,6 +26,11 @@
/**
* login window request.
*/
-extern void gui_401login_open(struct nsurl *url, const char *realm, nserror
(*cb)(bool proceed, void *pw), void *cbpw);
+extern nserror gui_401login_open(nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw);
#endif
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=d7fe09c5d213276290a143370e29a317a28d8959
commit d7fe09c5d213276290a143370e29a317a28d8959
Author: Michael Drake <[email protected]>
Commit: Michael Drake <[email protected]>
Amiga: Update for new HTTP auth API.
diff --git a/frontends/amiga/login.c b/frontends/amiga/login.c
index db15b43..78f46d3 100755
--- a/frontends/amiga/login.c
+++ b/frontends/amiga/login.c
@@ -70,14 +70,20 @@ static const struct ami_win_event_table ami_login_table = {
@todo check if this prevents us from quitting NetSurf */
};
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
+nserror gui_401login_open(nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw)
{
- const char *auth;
struct gui_login_window *lw = calloc(1, sizeof(struct
gui_login_window));
lwc_string *host = nsurl_get_component(url, NSURL_HOST);
+ size_t len;
assert(host != NULL);
+ assert(username != NULL);
+ assert(password != NULL);
lw->host = host;
lw->url = nsurl_ref(url);
@@ -85,25 +91,13 @@ void gui_401login_open(nsurl *url, const char *realm,
lw->cb = cb;
lw->cbpw = cbpw;
- auth = urldb_get_auth_details(lw->url, realm);
-
- if (auth == NULL) {
- lw->uname[0] = '\0';
- lw->pwd[0] = '\0';
- } else {
- const char *pwd;
- size_t pwd_len;
-
- pwd = strchr(auth, ':');
- assert(pwd && pwd < auth + sizeof(lw->uname));
- memcpy(lw->uname, auth, pwd - auth);
- lw->uname[pwd - auth] = '\0';
- ++pwd;
- pwd_len = strlen(pwd);
- assert(pwd_len < sizeof(lw->pwd));
- memcpy(lw->pwd, pwd, pwd_len);
- lw->pwd[pwd_len] = '\0';
- }
+ len = strlen(username);
+ assert(len < sizeof(lw->uname));
+ memcpy(lw->uname, username, len + 1);
+
+ len = strlen(password);
+ assert(len < sizeof(lw->pwd));
+ memcpy(lw->pwd, password, len + 1);
lw->objects[OID_MAIN] = WindowObj,
WA_ScreenTitle, ami_gui_get_screen_title(),
@@ -177,13 +171,15 @@ void gui_401login_open(nsurl *url, const char *realm,
lw->win = (struct Window *)RA_OpenWindow(lw->objects[OID_MAIN]);
ami_gui_win_list_add(lw, AMINS_LOGINWINDOW, &ami_login_table);
+
+ return NSERROR_OK;
}
static void ami_401login_close(struct gui_login_window *lw)
{
/* If continuation exists, then forbid refetch */
if (lw->cb != NULL)
- lw->cb(false, lw->cbpw);
+ lw->cb(NULL, NULL, lw->cbpw);
DisposeObject(lw->objects[OID_MAIN]);
lwc_string_unref(lw->host);
@@ -195,16 +191,12 @@ static void ami_401login_close(struct gui_login_window
*lw)
static void ami_401login_login(struct gui_login_window *lw)
{
ULONG *user,*pass;
- STRPTR userpass;
GetAttr(STRINGA_TextVal,lw->objects[GID_USER],(ULONG *)&user);
GetAttr(STRINGA_TextVal,lw->objects[GID_PASS],(ULONG *)&pass);
- userpass = ASPrintf("%s:%s",user,pass);
- urldb_set_auth_details(lw->url,lw->realm,userpass);
- FreeVec(userpass);
-
- lw->cb(true, lw->cbpw);
+ /* TODO: Encoding conversion to UTF8 for `user` and `pass`? */
+ lw->cb(user, pass, lw->cbpw);
/* Invalidate continuation */
lw->cb = NULL;
diff --git a/frontends/amiga/login.h b/frontends/amiga/login.h
index 058fa59..1f7b8f7 100755
--- a/frontends/amiga/login.h
+++ b/frontends/amiga/login.h
@@ -23,7 +23,11 @@
struct gui_login_window;
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw);
+nserror gui_401login_open(nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw)
#endif
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=8448b8e51f61c98e6ecb10cccf63cf6e2850486c
commit 8448b8e51f61c98e6ecb10cccf63cf6e2850486c
Author: Michael Drake <[email protected]>
Commit: Michael Drake <[email protected]>
HTTP Auth: Do get/set auth in the core.
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
index ca9eff1..b2b9a3b 100644
--- a/desktop/gui_factory.c
+++ b/desktop/gui_factory.c
@@ -679,10 +679,14 @@ static nserror gui_default_cert_verify(nsurl *url,
return NSERROR_NOT_IMPLEMENTED;
}
-static void gui_default_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
+static nserror gui_default_401login_open(nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw)
{
- cb(false, cbpw);
+ return NSERROR_NOT_IMPLEMENTED;
}
static void
diff --git a/desktop/netsurf.c b/desktop/netsurf.c
index f39a6ba..ae1a062 100644
--- a/desktop/netsurf.c
+++ b/desktop/netsurf.c
@@ -30,6 +30,7 @@
#include "utils/nsoption.h"
#include "utils/corestrings.h"
#include "utils/log.h"
+#include "utils/string.h"
#include "utils/utf8.h"
#include "utils/messages.h"
#include "content/content_factory.h"
@@ -94,6 +95,204 @@ static void netsurf_lwc_iterator(lwc_string *str, void *pw)
}
/**
+ * Build a "username:password" from components.
+ *
+ * \param[in] username The username component.
+ * \param[in] password The password component.
+ * \param[out] userpass_out Returns combined string on success.
+ * Owned by caller.
+ * \return NSERROR_OK, or appropriate error code.
+ */
+static nserror netsurf__build_userpass(
+ const char *username,
+ const char *password,
+ char **userpass_out)
+{
+ char *userpass = NULL;
+ size_t len = 0;
+ nserror err;
+
+ err = snstrjoin(&userpass, &len, ':', 2, username, password);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ *userpass_out = userpass;
+ return NSERROR_OK;
+}
+
+/**
+ * Unpack a "username:password" to components.
+ *
+ * \param[in] userpass The input string to split.
+ * \param[in] username_out Returns username on success. Owned by caller.
+ * \param[out] password_out Returns password on success. Owned by caller.
+ * \return NSERROR_OK, or appropriate error code.
+ */
+static nserror netsurf__unpack_userpass(
+ const char *userpass,
+ char **username_out,
+ char **password_out)
+{
+ const char *tmp;
+ char *username;
+ char *password;
+ size_t len;
+
+ if (userpass == NULL) {
+ username = malloc(1);
+ password = malloc(1);
+ if (username == NULL || password == NULL) {
+ return NSERROR_NOMEM;
+ }
+ username[0] = '\0';
+ password[0] = '\0';
+
+ *username_out = username;
+ *password_out = password;
+ return NSERROR_OK;
+ }
+
+ tmp = strchr(userpass, ':');
+ if (tmp == NULL) {
+ len = strlen(userpass);
+
+ username = malloc(len + 1);
+ password = malloc(1);
+ if (username == NULL || password == NULL) {
+ return NSERROR_NOMEM;
+ }
+ memcpy(username, userpass, len);
+ username[len] = '\0';
+ password[0] = '\0';
+ } else {
+ size_t len2;
+ len = tmp - userpass;
+ len2 = strlen(userpass) - len - 1;
+
+ username = malloc(len + 1);
+ password = malloc(len2 + 1);
+ if (username == NULL || password == NULL) {
+ return NSERROR_NOMEM;
+ }
+ memcpy(username, userpass, len);
+ username[len] = '\0';
+ memcpy(password, tmp + 1, len2);
+ }
+
+ *username_out = username;
+ *password_out = password;
+ return NSERROR_OK;
+}
+
+/**
+ * Contect for login callbacks to front ends.
+ */
+struct auth_data {
+ char *realm;
+ nsurl *url;
+
+ llcache_query_response cb;
+ void *pw;
+};
+
+/**
+ * Callback function passed to front ends for handling logins.
+ *
+ * \param[in] username The username.
+ * \param[in] password The password.
+ * \param[in] cbpw Our context.
+ * \return NSERROR_OK, or appropriate error code.
+ */
+static nserror netsurf__handle_login_response(
+ const char *username,
+ const char *password,
+ void *cbpw)
+{
+ struct auth_data *ctx = cbpw;
+ bool proceed = false;
+ nserror err;
+
+ if (username != NULL && password != NULL) {
+ char *userpass;
+
+ err = netsurf__build_userpass(username, password, &userpass);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ urldb_set_auth_details(ctx->url, ctx->realm, userpass);
+ free(userpass);
+ proceed = true;
+ }
+
+ err = ctx->cb(proceed, ctx->pw);
+ nsurl_unref(ctx->url);
+ free(ctx->realm);
+ free(ctx);
+ return err;
+}
+
+/**
+ * Helper for getting front end to handle logins.
+ *
+ * \param[in] query Query descriptor
+ * \param[in] pw Private data
+ * \param[in] cb Continuation callback
+ * \param[in] cbpw Private data for continuation
+ * \return NSERROR_OK, or appropriate error code.
+ */
+static nserror netsurf__handle_login(const llcache_query *query,
+ void *pw, llcache_query_response cb, void *cbpw)
+{
+ struct auth_data *ctx;
+ char *username;
+ char *password;
+ nserror err;
+
+ NSLOG(llcache, INFO, "HTTP Auth for: %s: %s",
+ query->data.auth.realm, nsurl_access(query->url));
+
+ ctx = malloc(sizeof(*ctx));
+ if (ctx == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ ctx->realm = strdup(query->data.auth.realm);
+ if (ctx->realm == NULL) {
+ free(ctx);
+ return NSERROR_NOMEM;
+ }
+ ctx->url = nsurl_ref(query->url);
+ ctx->cb = cb;
+ ctx->pw = cbpw;
+
+ err = netsurf__unpack_userpass(
+ urldb_get_auth_details(ctx->url, ctx->realm),
+ &username, &password);
+ if (err != NSERROR_OK) {
+ nsurl_unref(ctx->url);
+ free(ctx->realm);
+ free(ctx);
+ return err;
+ }
+
+ err = guit->misc->login(ctx->url, ctx->realm, username, password,
+ netsurf__handle_login_response, ctx);
+ free(username);
+ free(password);
+ if (err != NSERROR_OK) {
+ ctx->cb(false, ctx->pw);
+ nsurl_unref(ctx->url);
+ free(ctx->realm);
+ free(ctx);
+ return err;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
* Dispatch a low-level cache query to the frontend
*
* \param query Query descriptor
@@ -109,10 +308,7 @@ static nserror netsurf_llcache_query_handler(const
llcache_query *query,
switch (query->type) {
case LLCACHE_QUERY_AUTH:
- NSLOG(llcache, INFO, "HTTP Auth for: %s: %s",
- query->data.auth.realm,
- nsurl_access(query->url));
- guit->misc->login(query->url, query->data.auth.realm, cb, cbpw);
+ res = netsurf__handle_login(query, pw, cb, cbpw);
break;
case LLCACHE_QUERY_REDIRECT:
diff --git a/include/netsurf/misc.h b/include/netsurf/misc.h
index 2647b9a..d78bc3d 100644
--- a/include/netsurf/misc.h
+++ b/include/netsurf/misc.h
@@ -91,13 +91,29 @@ struct gui_misc_table {
* \param cbpw Context pointer passed to cb
* \return NSERROR_OK on sucess else error and cb never called
*/
- nserror (*cert_verify)(struct nsurl *url, const struct ssl_cert_info
*certs, unsigned long num, nserror (*cb)(bool proceed, void *pw), void *cbpw);
+ nserror (*cert_verify)(struct nsurl *url,
+ const struct ssl_cert_info *certs,
+ unsigned long num,
+ nserror (*cb)(bool proceed, void *pw),
+ void *cbpw);
/**
* Prompt user for login
+ *
+ * \param url The URL being verified.
+ * \param realm The authorization realm.
+ * \param username Any current username (or empty string).
+ * \param password Any current password (or empty string).
+ * \param cb Callback upon user decision.
+ * \param cbpw Context pointer passed to cb
+ * \return NSERROR_OK on sucess else error and cb never called
*/
- void (*login)(struct nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw);
+ nserror (*login)(struct nsurl *url, const char *realm,
+ const char *username, const char *password,
+ nserror (*cb)(const char *username,
+ const char *password,
+ void *pw),
+ void *cbpw);
/**
* Prompt the user for a password for a PDF.
-----------------------------------------------------------------------
--
NetSurf Browser
_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org