From caac2628a7b3dafd707c385a50d98a3028085b60 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Thu, 23 Oct 2003 00:09:17 +0000 Subject: [project @ 2003-10-23 00:09:16 by jmb] Enable logging into sites which require Basic Authentication Has a couple of issues: 1) Opens the page in the first window in the list 2) Doesn't save the login details so you have to log in to each page. 3) The call to ro_gui_401login_open shouldn't be there. svn path=/import/netsurf/; revision=372 --- riscos/401login.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ riscos/dialog.c | 7 ++- riscos/gui.c | 1 + riscos/gui.h | 12 +++++ 4 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 riscos/401login.c (limited to 'riscos') diff --git a/riscos/401login.c b/riscos/401login.c new file mode 100644 index 000000000..0ab0ffbea --- /dev/null +++ b/riscos/401login.c @@ -0,0 +1,140 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2003 John M Bell + */ + +#include +#include +#include "oslib/wimp.h" +#include "netsurf/desktop/401login.h" +#include "netsurf/desktop/gui.h" +#include "netsurf/riscos/gui.h" +#include "netsurf/utils/log.h" +#include "netsurf/utils/messages.h" +#include "netsurf/utils/utils.h" + +static void get_unamepwd(void); +static void do_thing(void); + +static wimp_window *dialog_401; +extern wimp_w dialog_401li; + +struct login LOGIN; + +static char *uname; +static char* url; +static char *pwd; + +/** + * Load the 401 login window template. + */ + +void ro_gui_401login_init(void) +{ + char name[] = "dialog_401li"; + int context, window_size, data_size; + char *data; + + /* find required buffer sizes */ + context = wimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS, + name, 0, &window_size, &data_size); + assert(context != 0); + + dialog_401 = xcalloc((unsigned int) window_size, 1); + data = xcalloc((unsigned int) data_size, 1); + + /* load */ + wimp_load_template(dialog_401, data, data + data_size, + wimp_NO_FONTS, name, 0, 0, 0); +} + +/** + * Open a 401 login window. + */ + +void ro_gui_401login_open(char *host, char* realm, char *fetchurl) +{ + url = xstrdup(fetchurl); + uname = xstrdup(""); + pwd = xstrdup(""); + + /* fill in download window icons */ + dialog_401->icons[ICON_401LOGIN_HOST].data.indirected_text.text = + host; + dialog_401->icons[ICON_401LOGIN_HOST].data.indirected_text.size = + strlen(host) + 1; + dialog_401->icons[ICON_401LOGIN_REALM].data.indirected_text.text = + realm; + dialog_401->icons[ICON_401LOGIN_REALM].data.indirected_text.size = + strlen(realm) + 1; + dialog_401->icons[ICON_401LOGIN_USERNAME].data.indirected_text.text = + uname; + dialog_401->icons[ICON_401LOGIN_PASSWORD].data.indirected_text.text = + pwd; + + /* create and open the window */ + dialog_401li = wimp_create_window(dialog_401); + ro_gui_dialog_open(dialog_401li); + wimp_set_caret_position(dialog_401li, ICON_401LOGIN_USERNAME,0,0,0,0); +} + +/* Login Clicked -> create a new fetch request, specifying uname & pwd + * CURLOPT_USERPWD takes a string "username:password" + */ +void ro_gui_401login_click(wimp_pointer *pointer) { + + if (pointer->buttons == wimp_CLICK_MENU) return; + + switch (pointer->i) { + case ICON_401LOGIN_LOGIN: + if (pointer->buttons == wimp_CLICK_SELECT) { + LOG(("here")); + get_unamepwd(); + ro_gui_dialog_close(dialog_401li); + do_thing(); + LOGIN.string = 0; /* TODO: keep the details until we + * access a new site */ + } + else + ro_gui_dialog_close(dialog_401li); + break; + case ICON_401LOGIN_CANCEL: + if (pointer->buttons == wimp_CLICK_SELECT) + ro_gui_dialog_close(dialog_401li); + else { + get_unamepwd(); + ro_gui_dialog_close(dialog_401li); + do_thing(); + LOGIN.string = 0; /* TODO: keep the details until we + * access a new site */ + } + break; + default: break; + } +} + +void get_unamepwd() { + + LOGIN.string = xcalloc(strlen(uname)+strlen(pwd)+2, sizeof(char)); + + sprintf(LOGIN.string, "%s:%s", uname, pwd); + LOG(("%s", LOGIN.string)); +} + +void do_thing() { + + struct gui_window *gw; + + /* TODO: fix this. For now we just open the page in the + * first window in the list. */ + for (gw=window_list; gw!=NULL; gw=gw->next) { + if (gw->type == GUI_BROWSER_WINDOW /*&& + (strcasecmp(gw->url, url)==0 || + strcasecmp(gw->data.browser.bw->url, url)==0)*/) + break; + } + if (gw != NULL) + browser_window_open_location_historical(gw->data.browser.bw, url); +} diff --git a/riscos/dialog.c b/riscos/dialog.c index f8df58bb0..5dd170dc6 100644 --- a/riscos/dialog.c +++ b/riscos/dialog.c @@ -25,7 +25,8 @@ wimp_w dialog_info, dialog_saveas, dialog_config, dialog_config_br, - dialog_config_prox, dialog_config_th, download_template; + dialog_config_prox, dialog_config_th, download_template, + dialog_401li; wimp_menu* theme_menu = NULL; static struct ro_choices choices; @@ -121,7 +122,7 @@ void ro_gui_dialog_open(wimp_w w) screen_x, screen_y, dx, dy; wimp_window_state open; - /* find screen centre in os units */ + /* find screen centre in os units */ os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_XEIG_FACTOR, &xeig_factor); os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_YEIG_FACTOR, &yeig_factor); os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_XWIND_LIMIT, &xwind_limit); @@ -160,6 +161,8 @@ void ro_gui_dialog_click(wimp_pointer *pointer) ro_gui_dialog_click_config_prox(pointer); else if (pointer->w == dialog_config_th) ro_gui_dialog_click_config_th(pointer); + else if (pointer->w == dialog_401li) + ro_gui_401login_click(pointer); } diff --git a/riscos/gui.c b/riscos/gui.c index 4fca50964..ca21c4e83 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -609,6 +609,7 @@ void gui_init(int argc, char** argv) ro_gui_dialog_init(); ro_gui_download_init(); ro_gui_menus_init(); + ro_gui_401login_init(); wimp_close_template(); } diff --git a/riscos/gui.h b/riscos/gui.h index 83cb15a2a..3ad54ed0a 100644 --- a/riscos/gui.h +++ b/riscos/gui.h @@ -120,6 +120,11 @@ void ro_gui_start_selection(wimp_pointer *pointer, wimp_window_state *state, gui_window *g); void ro_gui_drag_end(wimp_dragged* drag); +/* in 401login.c */ +void ro_gui_401login_init(void); +void ro_gui_401login_open(char* host, char * realm, char* fetchurl); +void ro_gui_401login_click(wimp_pointer *pointer); + /* icon numbers */ #define ICON_CONFIG_SAVE 0 #define ICON_CONFIG_CANCEL 1 @@ -159,4 +164,11 @@ void ro_gui_drag_end(wimp_dragged* drag); #define ICON_DOWNLOAD_PATH 3 #define ICON_DOWNLOAD_ABORT 4 +#define ICON_401LOGIN_LOGIN 0 +#define ICON_401LOGIN_CANCEL 1 +#define ICON_401LOGIN_HOST 2 +#define ICON_401LOGIN_REALM 3 +#define ICON_401LOGIN_USERNAME 4 +#define ICON_401LOGIN_PASSWORD 5 + #endif -- cgit v1.2.3