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

Reply via email to