tGTK+ HTTP authentication dialog now called (almost) properly when needed - vac… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit aa38d66d5be2f4de64e3beb58c67937ebd7bcc93 | |
parent a1952c3b817dae1e9e9835751e2fe5dfe3e1fed5 | |
Author: Ben Webb <[email protected]> | |
Date: Thu, 4 Oct 2001 19:13:32 +0000 | |
GTK+ HTTP authentication dialog now called (almost) properly when needed | |
Diffstat: | |
M src/gtk_client.c | 108 +++++++++++++++++++++++++++++… | |
M src/network.c | 17 +++++++++++++++++ | |
M src/network.h | 15 +++++++++++++-- | |
3 files changed, 138 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/src/gtk_client.c b/src/gtk_client.c | |
t@@ -95,6 +95,7 @@ static void NewGameDialog(void); | |
static void StartGame(void); | |
static void EndGame(void); | |
static void UpdateMenus(void); | |
+static gboolean AuthDialog(HttpConnection *conn,gchar *realm); | |
#ifdef NETWORKING | |
static void GetClientMessage(gpointer data,gint socket, | |
t@@ -2074,6 +2075,7 @@ static void UpdateMetaServerList(GtkWidget *widget, | |
if (OpenMetaHttpConnection(&widgets->MetaConn)) { | |
metaserv=widgets->metaserv; | |
+ SetHttpAuthFunc(widgets->MetaConn,AuthDialog); | |
SetNetworkBufferCallBack(&widgets->MetaConn->NetBuf, | |
MetaSocketStatus,(gpointer)widgets); | |
} else { | |
t@@ -3076,6 +3078,112 @@ void DisplaySpyReports(Player *Play) { | |
gtk_widget_show_all(notebook); | |
} | |
+static void OKAuthDialog(GtkWidget *widget,GtkWidget *window) { | |
+ GtkWidget *userentry,*passwdentry; | |
+ gchar *username,*password; | |
+ HttpConnection *conn; | |
+ gboolean *retval; | |
+ | |
+ userentry = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window),"username"); | |
+ passwdentry = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), | |
+ "password"); | |
+ retval = (gboolean *)gtk_object_get_data(GTK_OBJECT(window),"retval"); | |
+ conn = (HttpConnection *)gtk_object_get_data(GTK_OBJECT(window),"httpconn"); | |
+ g_assert(userentry && passwdentry && retval && conn); | |
+ | |
+ *retval = TRUE; | |
+ | |
+ username = gtk_editable_get_chars(GTK_EDITABLE(userentry),0,-1); | |
+ password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry),0,-1); | |
+ | |
+ SetHttpAuthentication(conn,username,password); | |
+ g_free(username); g_free(password); | |
+ | |
+ gtk_widget_destroy(window); | |
+} | |
+ | |
+void DestroyAuthDialog(GtkWidget *widget,gpointer data) { | |
+ gtk_main_quit(); | |
+} | |
+ | |
+gboolean AuthDialog(HttpConnection *conn,gchar *realm) { | |
+ GtkWidget *window,*button,*hsep,*vbox,*label,*entry,*table,*hbbox; | |
+ gboolean retval=FALSE; | |
+ | |
+ window=gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
+ GTK_SIGNAL_FUNC(DestroyAuthDialog),NULL); | |
+ gtk_object_set_data(GTK_OBJECT(window),"retval",(gpointer)&retval); | |
+ gtk_object_set_data(GTK_OBJECT(window),"httpconn",(gpointer)conn); | |
+ | |
+ if (conn->proxyauth) { | |
+ gtk_window_set_title(GTK_WINDOW(window), | |
+/* Title of dialog for authenticating with a proxy server */ | |
+ _("Proxy Authentication Required")); | |
+ } else { | |
+/* Title of dialog for authenticating with a web server */ | |
+ gtk_window_set_title(GTK_WINDOW(window),_("Authentication Required")); | |
+ } | |
+ | |
+ gtk_window_set_modal(GTK_WINDOW(window),TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(window), | |
+ GTK_WINDOW(ClientData.window)); | |
+ gtk_container_set_border_width(GTK_CONTAINER(window),7); | |
+ | |
+ vbox=gtk_vbox_new(FALSE,7); | |
+ | |
+ table=gtk_table_new(3,3,FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table),10); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table),5); | |
+ | |
+ label=gtk_label_new("Realm:"); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1); | |
+ | |
+ label=gtk_label_new(realm); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,0,1); | |
+ | |
+ label=gtk_label_new("User name:"); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2); | |
+ | |
+ entry=gtk_entry_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window),"username",(gpointer)entry); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,1,2); | |
+ | |
+ label=gtk_label_new("Password:"); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3); | |
+ | |
+ entry=gtk_entry_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window),"password",(gpointer)entry); | |
+ gtk_entry_set_visibility(GTK_ENTRY(entry),FALSE); | |
+ gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,3); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0); | |
+ | |
+ hsep=gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ | |
+ hbbox = gtk_hbutton_box_new(); | |
+ | |
+ button=gtk_button_new_with_label(_("OK")); | |
+ gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
+ GTK_SIGNAL_FUNC(OKAuthDialog),(gpointer)window); | |
+ gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ | |
+ button=gtk_button_new_with_label(_("Cancel")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)window); | |
+ gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox),hbbox,TRUE,TRUE,0); | |
+ | |
+ gtk_container_add(GTK_CONTAINER(window),vbox); | |
+ gtk_widget_show_all(window); | |
+ | |
+ gtk_main(); | |
+ return retval; | |
+} | |
+ | |
#else | |
#include <glib.h> | |
diff --git a/src/network.c b/src/network.c | |
t@@ -512,6 +512,9 @@ void CloseHttpConnection(HttpConnection *conn) { | |
g_free(conn->Body); | |
g_free(conn->RedirHost); | |
g_free(conn->RedirQuery); | |
+ g_free(conn->realm); | |
+ g_free(conn->user); | |
+ g_free(conn->password); | |
g_free(conn); | |
} | |
t@@ -519,6 +522,19 @@ gboolean IsHttpError(HttpConnection *conn) { | |
return IsError(&conn->NetBuf.error); | |
} | |
+void SetHttpAuthentication(HttpConnection *conn,gchar *user,gchar *password) { | |
+ g_assert(conn && user && password); | |
+ g_free(conn->user); | |
+ g_free(conn->password); | |
+ conn->user = g_strdup(user); | |
+ conn->password = g_strdup(password); | |
+} | |
+ | |
+void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc) { | |
+ g_assert(conn && authfunc); | |
+ conn->authfunc = authfunc; | |
+} | |
+ | |
static gboolean ParseHtmlLocation(gchar *uri,gchar **host,unsigned *port, | |
gchar **query) { | |
gchar *uris,*colon,*slash; | |
t@@ -576,6 +592,7 @@ static void ParseHtmlHeader(gchar *line,HttpConnection *co… | |
} else if (g_strcasecmp(split[0],"WWW-Authenticate:")==0 && | |
conn->StatusCode==401) { | |
g_print("FIXME: Authentication %s required\n",split[1]); | |
+ if (conn->authfunc) (*conn->authfunc)(conn,split[1]); | |
} | |
} | |
g_strfreev(split); | |
diff --git a/src/network.h b/src/network.h | |
t@@ -85,8 +85,12 @@ typedef enum { | |
HS_CONNECTING, HS_READHEADERS, HS_READSEPARATOR, HS_READBODY | |
} HttpStatus; | |
+typedef struct _HttpConnection HttpConnection; | |
+ | |
+typedef gboolean (*HCAuthFunc)(struct _HttpConnection *conn,gchar *realm); | |
+ | |
/* A structure used to keep track of an HTTP connection */ | |
-typedef struct _HttpConnection { | |
+struct _HttpConnection { | |
gchar *HostName; /* The machine on which the desired page resides */ | |
unsigned Port; /* The port */ | |
gchar *Proxy; /* If non-NULL, a web proxy to use */ | |
t@@ -98,11 +102,16 @@ typedef struct _HttpConnection { | |
gchar *RedirHost; /* if non-NULL, a hostname to redirect to */ | |
gchar *RedirQuery; /* if non-NULL, the path to redirect to */ | |
unsigned RedirPort; /* The port on the host to redirect to */ | |
+ HCAuthFunc authfunc; /* Callback function for authentication */ | |
+ gboolean proxyauth; /* TRUE if the authentication is with a proxy */ | |
+ gchar *realm; /* The realm for basic HTTP authentication */ | |
+ gchar *user; /* The supplied username */ | |
+ gchar *password; /* The supplied password */ | |
NetworkBuffer NetBuf; /* The actual network connection itself */ | |
gint Tries; /* Number of requests actually sent so far */ | |
gint StatusCode; /* 0=no status yet, otherwise an HTTP status code */ | |
HttpStatus Status; | |
-} HttpConnection; | |
+}; | |
void InitNetworkBuffer(NetworkBuffer *NetBuf,char Terminator,char StripChar); | |
void SetNetworkBufferCallBack(NetworkBuffer *NetBuf,NBCallBack CallBack, | |
t@@ -132,6 +141,8 @@ gboolean OpenHttpConnection(HttpConnection **conn,gchar *H… | |
void CloseHttpConnection(HttpConnection *conn); | |
gboolean IsHttpError(HttpConnection *conn); | |
gchar *ReadHttpResponse(HttpConnection *conn); | |
+void SetHttpAuthentication(HttpConnection *conn,gchar *user,gchar *password); | |
+void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc); | |
gboolean HandleHttpCompletion(HttpConnection *conn); | |
gboolean StartConnect(int *fd,gchar *RemoteHost,unsigned RemotePort, |