[webkit-reviews] review denied: [Bug 16947] [GTK] Missing HTTP Auth challenge : [Attachment 19162] basic authentication

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Mon Feb 18 19:24:10 PST 2008


Alp Toker <alp at atoker.com> has denied Luca Bruno <lethalman88 at gmail.com>'s
request for review:
Bug 16947: [GTK] Missing HTTP Auth challenge
http://bugs.webkit.org/show_bug.cgi?id=16947

Attachment 19162: basic authentication
http://bugs.webkit.org/attachment.cgi?id=19162&action=edit

------- Additional Comments from Alp Toker <alp at atoker.com>
This is conceptually fine. There are a few style issues and bugs to be resolved
before getting it in:

>Index: ChangeLog
>===================================================================
>--- ChangeLog	(revision 30341)
>+++ ChangeLog	(working copy)
>@@ -1,3 +1,12 @@
>+2008-02-16  Luca Bruno  <lethalman88 at gmail.com>
>+
>+	  Reviewed by NOBODY (OOPS!).
>+
>+	  http://bugs.webkit.org/show_bug.cgi?id=16947
>+	  Bug 16947: [GTK] Missing HTTP Auth challenge
>+
>+	  * GNUmakefile.am: add webkitauthenticationchallenge.cpp and
webkitauthenticationchallenge.h
>+
> 2008-02-15  Alp Toker  <alp at atoker.com>
> 
>	  Reviewed by Holger.
>Index: GNUmakefile.am
>===================================================================
>--- GNUmakefile.am	(revision 30340)
>+++ GNUmakefile.am	(working copy)
>@@ -249,6 +249,7 @@ webkitgtk_cppflags += \
> 
> webkitgtk_h_api += \
>	WebKit/gtk/webkit/webkit.h \
>+	WebKit/gtk/webkit/webkitauthenticationchallenge.h \
>	WebKit/gtk/webkit/webkitdefines.h \
>	WebKit/gtk/webkit/webkitnetworkrequest.h \
>	WebKit/gtk/webkit/webkitwebbackforwardlist.h \
>@@ -272,6 +273,7 @@ webkitgtk_headers += \
>	WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.h
> 
> webkitgtk_sources += \
>+	WebKit/gtk/webkit/webkitauthenticationchallenge.cpp \
>	WebKit/gtk/webkit/webkitnetworkrequest.cpp \
>	WebKit/gtk/webkit/webkitprivate.cpp \
>	WebKit/gtk/webkit/webkitwebbackforwardlist.cpp \
>Index: WebCore/ChangeLog
>===================================================================
>--- WebCore/ChangeLog	(revision 30341)
>+++ WebCore/ChangeLog	(working copy)
>@@ -1,3 +1,25 @@
>+2008-02-16  Luca Bruno  <lethalman88 at gmail.com>
>+
>+	  Reviewed by NOBODY (OOPS!).
>+
>+	  WARNING: NO TEST CASES ADDED OR CHANGED
>+
>+	  http://bugs.webkit.org/show_bug.cgi?id=16947
>+	  Bug 16947: [GTK] Missing HTTP Auth challenge
>+
>+	  * WebCore.pro: add webkitauthenticationchallenge.cpp and
webkitauthenticationchallenge.h
>+	  * platform/network/ResourceHandle.h:
>+	  * platform/network/ResourceHandleInternal.h:
>+	  (WebCore::ResourceHandleInternal::ResourceHandleInternal):
>+	  * platform/network/curl/ResourceHandleCurl.cpp:
>+	  (WebCore::ResourceHandle::didReceiveAuthenticationChallenge): added,
called by cURL backend
>+	  (WebCore::ResourceHandle::receivedCredential): added
>+	 
(WebCore::ResourceHandle::receivedRequestToContinueWithoutCredential): added
>+	  (WebCore::ResourceHandle::receivedCancellation): added
>+	  * platform/network/curl/ResourceHandleManager.cpp:
>+	  (WebCore::headerCallback): check for authentication
>+	  (WebCore::ResourceHandleManager::startJob): use the authentication
>+
> 2008-02-16  Kevin Ollivier  <kevino at theolliviers.com>
> 
>	  wx build fix.
>Index: WebCore/WebCore.pro
>===================================================================
>--- WebCore/WebCore.pro	(revision 30340)
>+++ WebCore/WebCore.pro	(working copy)
>@@ -993,6 +993,7 @@ gtk-port {
>	  ../WebCore/platform/gtk/ClipboardGtk.h \
>	  ../WebCore/platform/gtk/PasteboardHelper.h \
>	  ../WebKit/gtk/webkit/webkit.h \
>+	  ../WebKit/gtk/webkit/webkitauthenticationchallenge.h \
>	  ../WebKit/gtk/webkit/webkitdefines.h \
>	  ../WebKit/gtk/webkit/webkitnetworkrequest.h \
>	  ../WebKit/gtk/webkit/webkitprivate.h \
>@@ -1074,6 +1075,7 @@ gtk-port {
>	  platform/image-decoders/bmp/BMPImageDecoder.cpp \
>	  platform/image-decoders/ico/ICOImageDecoder.cpp \
>	  platform/image-decoders/xbm/XBMImageDecoder.cpp \
>+	  ../WebKit/gtk/webkit/webkitauthenticationchallenge.cpp \
>	  ../WebKit/gtk/webkit/webkitnetworkrequest.cpp \
>	  ../WebKit/gtk/webkit/webkitprivate.cpp \
>	  ../WebKit/gtk/webkit/webkitwebbackforwardlist.cpp \
>Index: WebCore/platform/network/ResourceHandle.h
>===================================================================
>--- WebCore/platform/network/ResourceHandle.h	(revision 30340)
>+++ WebCore/platform/network/ResourceHandle.h	(working copy)
>@@ -116,6 +116,12 @@ public:
>     static void setHostAllowsAnyHTTPSCertificate(const String&);
>     static void setClientCertificate(const String& host, CFDataRef);
> #endif
>+#if PLATFORM(GTK)
>+    void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
>+    void receivedCredential(const AuthenticationChallenge&, const
Credential&);
>+    void receivedRequestToContinueWithoutCredential(const
AuthenticationChallenge&);
>+    void receivedCancellation(const AuthenticationChallenge&);
>+#endif

^ Don't copy this block, just add GTK to the existing block eg.

#if PLATFORM(MAC) || USE(CFNETWORK) || PLATFORM(GTK)



>     PassRefPtr<SharedBuffer> bufferedData();
>     static bool supportsBufferedData();
>     
>Index: WebCore/platform/network/ResourceHandleInternal.h
>===================================================================
>--- WebCore/platform/network/ResourceHandleInternal.h	(revision 30340)
>+++ WebCore/platform/network/ResourceHandleInternal.h	(working copy)
>@@ -101,6 +101,8 @@ namespace WebCore {
>	      , m_file(0)
>	      , m_formDataElementIndex(0)
>	      , m_formDataElementDataOffset(0)
>+	      , m_webChallenge()
>+	      , m_continueWithoutCredential(false)
> #endif
> #if PLATFORM(QT)
>	      , m_job(0)
>@@ -159,6 +161,9 @@ namespace WebCore {
>	  size_t m_formDataElementIndex;
>	  size_t m_formDataElementDataOffset;
>	  Vector<char> m_postBytes;
>+
>+	  AuthenticationChallenge m_webChallenge;
>+	  bool m_continueWithoutCredential;
> #endif
> #if PLATFORM(QT)
> #if QT_VERSION < 0x040400
>Index: WebCore/platform/network/curl/ResourceHandleCurl.cpp
>===================================================================
>--- WebCore/platform/network/curl/ResourceHandleCurl.cpp	(revision
30340)
>+++ WebCore/platform/network/curl/ResourceHandleCurl.cpp	(working copy)
>@@ -95,4 +95,69 @@ void ResourceHandle::loadResourceSynchro
>     notImplemented();
> }
> 
>+void ResourceHandle::didReceiveAuthenticationChallenge(const
AuthenticationChallenge& challenge)
>+{
>+    /* FIXME: add support for FTP, HTTPS, and FTPS authentication,
>+     * get the right port, server and authentication scheme
>+     */
>+    ResourceHandleInternal* d = getInternal();
>+    if (d->m_continueWithoutCredential)
>+	  return;
>+    cancel();
>+
>+    ProtectionSpace protectionSpace;
>+    unsigned previousFailureCount = 0;
>+    if (challenge.isNull()) {
>+	  protectionSpace =
ProtectionSpace(d->m_response.httpHeaderField("Host"),
>+					    80,
>+					    ProtectionSpaceServerHTTP,
>+					   
d->m_response.httpHeaderField("Realm"),
>+					   
ProtectionSpaceAuthenticationSchemeDefault);
>+    } else {
>+	  protectionSpace = d->m_webChallenge.protectionSpace();
>+	  previousFailureCount = d->m_webChallenge.previousFailureCount()+1;
>+    }
>+    
>+    d->m_webChallenge = AuthenticationChallenge(protectionSpace,
>+						 
challenge.proposedCredential(),
>+						  previousFailureCount,
>+						  d->m_response,
>+						  challenge.error());
>+
>+    if (d->client())
>+	  d->client()->didReceiveAuthenticationChallenge(this,
d->m_webChallenge);
>+}
>+
>+void ResourceHandle::receivedCredential(const AuthenticationChallenge&
challenge, const Credential& credential)
>+{
>+    ASSERT(!challenge.isNull());   
>+    ResourceHandleInternal* d = getInternal();
>+    if (challenge != d->m_webChallenge)
>+	  return;
>+
>+    d->m_webChallenge = AuthenticationChallenge(challenge.protectionSpace(),
>+						  credential,
>+						 
challenge.previousFailureCount(),
>+						  challenge.failureResponse(),
>+						  challenge.error());
>+
>+    ResourceHandleManager::sharedInstance()->add(this);
>+}
>+
>+void ResourceHandle::receivedRequestToContinueWithoutCredential(const
AuthenticationChallenge& challenge)
>+{
>+    ASSERT(!challenge.isNull());   
>+    ResourceHandleInternal* d = getInternal();
>+    if (challenge != d->m_webChallenge)
>+	  return;
>+
>+    d->m_continueWithoutCredential = true;
>+    ResourceHandleManager::sharedInstance()->add(this);
>+}
>+
>+void ResourceHandle::receivedCancellation(const AuthenticationChallenge&
challenge)
>+{
>+    notImplemented();
>+}
>+
> } // namespace WebCore
>Index: WebCore/platform/network/curl/ResourceHandleManager.cpp
>===================================================================
>--- WebCore/platform/network/curl/ResourceHandleManager.cpp	(revision
30340)
>+++ WebCore/platform/network/curl/ResourceHandleManager.cpp	(working copy)
>@@ -168,6 +168,10 @@ static size_t headerCallback(char* ptr, 
>	 
d->m_response.setTextEncodingName(extractCharsetFromMediaType(d->m_response.htt
pHeaderField("Content-Type")));
>	 
d->m_response.setSuggestedFilename(filenameFromHTTPContentDisposition(d->m_resp
onse.httpHeaderField("Content-Disposition")));
> 
>+	  // HTTP authentication
>+	  if (httpCode == 401 && d->m_response.isHTTP())
>+	      job->didReceiveAuthenticationChallenge(d->m_webChallenge);
>+
>	  // HTTP redirection
>	  if (httpCode >= 300 && httpCode < 400) {
>	      String location = d->m_response.httpHeaderField("location");
>@@ -546,6 +550,9 @@ void ResourceHandleManager::startJob(Res
>     }
> 
>     d->m_handle = curl_easy_init();
>+    // HTTP Authentication cancels the job so be sure the new job is not
cancelled
>+    d->m_cancelled = false;  
>+
> #ifndef NDEBUG
>     if (getenv("DEBUG_CURL"))
>	  curl_easy_setopt(d->m_handle, CURLOPT_VERBOSE, 1);
>@@ -575,6 +582,23 @@ void ResourceHandleManager::startJob(Res
>	  curl_easy_setopt(d->m_handle, CURLOPT_COOKIEJAR,
m_cookieJarFileName);
>     }
> 
>+    if (!d->m_webChallenge.isNull() && !d->m_continueWithoutCredential) {
>+	  long curlAuth;
>+	  switch(d->m_webChallenge.protectionSpace().authenticationScheme()) { 
	
>+	  case ProtectionSpaceAuthenticationSchemeHTTPBasic:
>+	  case ProtectionSpaceAuthenticationSchemeDefault:
>+	  default:
>+	      curlAuth = CURLAUTH_BASIC;
>+	      break;
>+	  }
>+
>+	  Credential credential = d->m_webChallenge.proposedCredential();
>+	  String userpwd = credential.user() + ":" + credential.password();
>+	  
>+	  curl_easy_setopt(d->m_handle, CURLOPT_HTTPAUTH, curlAuth);
>+	  curl_easy_setopt(d->m_handle, CURLOPT_USERPWD,
strdup(userpwd.utf8().data()));
>+    }
>+
>     struct curl_slist* headers = 0;
>     if (job->request().httpHeaderFields().size() > 0) {
>	  HTTPHeaderMap customHeaders = job->request().httpHeaderFields();
>Index: WebKit/gtk/ChangeLog
>===================================================================
>--- WebKit/gtk/ChangeLog	(revision 30341)
>+++ WebKit/gtk/ChangeLog	(working copy)
>@@ -1,3 +1,19 @@
>+2008-02-16  Luca Bruno  <lethalman88 at gmail.com>
>+
>+	  Reviewed by NOBODY (OOPS!).
>+
>+	  http://bugs.webkit.org/show_bug.cgi?id=16947
>+	  Bug 16947: [GTK] Missing HTTP Auth challenge
>+
>+	  * WebCoreSupport/FrameLoaderClientGtk.cpp:
>+	 
(WebKit::FrameLoaderClient::dispatchDidReceiveAuthenticationChallenge):
implemented
>+	  * webkit/webkitdefines.h:
>+	  * webkit/webkitprivate.h:
>+	  * webkit/webkitwebview.cpp: add authentication-requested signal and
create auth dialog
>+	  * webkit/webkitwebview.h:
>+	  * webkit/webkitauthenticationchallenge.cpp: added
>+	  * webkit/webkitauthenticationchallenge.h: added
>+
> 2008-02-15  Alp Toker  <alp at atoker.com>
> 
>	  Fix the GTK+ build following breakage introduced in r30243.
>Index: WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp
>===================================================================
>--- WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp (revision 30340)
>+++ WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp (working copy)
>@@ -30,6 +30,7 @@
> #include "HTMLFrameOwnerElement.h"
> #include "HTMLNames.h"
> #include "Language.h"
>+#include "MainResourceLoader.h"
> #include "MIMETypeRegistry.h"
> #include "NotImplemented.h"
> #include "PlatformString.h"
>@@ -39,6 +40,7 @@
> #include "kjs_binding.h"
> #include "kjs_proxy.h"
> #include "kjs_window.h"
>+#include "webkitauthenticationchallenge.h"
> #include "webkitwebview.h"
> #include "webkitwebframe.h"
> #include "webkitprivate.h"
>@@ -165,9 +167,24 @@ void FrameLoaderClient::committedLoad(Do
>     fl->addData(data, length);
> }
> 
>-void
FrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*,
unsigned long  identifier, const AuthenticationChallenge&)
>+void
FrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*
documentLoader, unsigned long identifier, const AuthenticationChallenge&
webChallenge)
> {
>-    notImplemented();
>+    ResourceHandle* handle = documentLoader->mainResourceLoader()->handle();
>+    ASSERT(handle);
>+    if (!handle)
>+	  return;
>+    
>+    WebKitAuthenticationChallenge* challenge =
webkit_authentication_challenge_new();
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+    *challengePrivate->webChallenge = webChallenge;
>+    challengePrivate->webHandle = handle;
>+    
>+    Credential credential = webChallenge.proposedCredential();
>+    webkit_authentication_challenge_set_user(challenge,
credential.user().utf8().data());
>+    webkit_authentication_challenge_set_password(challenge,
credential.password().utf8().data());
>+    
>+    WebKitWebView* webView = getViewFromFrame(m_frame);
>+    g_signal_emit_by_name(webView, "authentication-requested", m_frame,
challenge, NULL);
> }
> 
> void
FrameLoaderClient::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
unsigned long  identifier, const AuthenticationChallenge&)
>Index: WebKit/gtk/webkit/webkitauthenticationchallenge.cpp
>===================================================================
>--- WebKit/gtk/webkit/webkitauthenticationchallenge.cpp	(revision 0)
>+++ WebKit/gtk/webkit/webkitauthenticationchallenge.cpp	(revision 0)
>@@ -0,0 +1,138 @@
>+/*
>+ * Copyright (C) 2008 Luca Bruno
>+ *
>+ * This library is free software; you can redistribute it and/or
>+ * modify it under the terms of the GNU Library General Public
>+ * License as published by the Free Software Foundation; either
>+ * version 2 of the License, or (at your option) any later version.
>+ *
>+ * This library is distributed in the hope that it will be useful,
>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+ * Library General Public License for more details.
>+ *
>+ * You should have received a copy of the GNU Library General Public License
>+ * along with this library; see the file COPYING.LIB.  If not, write to
>+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
>+ * Boston, MA 02110-1301, USA.
>+ */
>+
>+#include "config.h"
>+
>+#include "webkitauthenticationchallenge.h"
>+#include "webkitprivate.h"
>+
>+#include "Credential.h"
>+#include "ResourceHandle.h"
>+
>+using namespace WebKit;
>+using namespace WebCore;
>+
>+extern "C" {
>+
>+G_DEFINE_TYPE(WebKitAuthenticationChallenge, webkit_authentication_challenge,
G_TYPE_OBJECT);
>+
>+static void webkit_authentication_challenge_finalize(GObject* object)
>+{
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(object);
>+
>+    delete challengePrivate->webChallenge;
>+    g_free(challengePrivate->user);
>+    g_free(challengePrivate->password);
>+
>+   
G_OBJECT_CLASS(webkit_authentication_challenge_parent_class)->finalize(object);

>+}
>+
>+static void
webkit_authentication_challenge_class_init(WebKitAuthenticationChallengeClass*
challengeClass)
>+{
>+    g_type_class_add_private(challengeClass,
sizeof(WebKitAuthenticationChallengePrivate));
>+
>+    G_OBJECT_CLASS(challengeClass)->finalize =
webkit_authentication_challenge_finalize;
>+}
>+
>+static void
webkit_authentication_challenge_init(WebKitAuthenticationChallenge* challenge)

^ A better name (by our conventions so far) for this would be
WebKitWebAuthChallenge. You'll need to change the filenames etc. to match this.




>+{
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+
>+    challengePrivate->webChallenge = new AuthenticationChallenge();
>+    challengePrivate->webHandle = NULL;
>+    challengePrivate->user = NULL;
>+    challengePrivate->password = NULL;
>+}
>+
>+WebKitAuthenticationChallenge* webkit_authentication_challenge_new()
>+{
>+    WebKitAuthenticationChallenge* challenge =
WEBKIT_AUTHENTICATION_CHALLENGE(g_object_new(WEBKIT_TYPE_AUTHENTICATION_CHALLEN
GE, NULL));
>+
>+    return challenge;
>+}
>+
>+void webkit_authentication_challenge_set_user(WebKitAuthenticationChallenge*
challenge, const gchar* user)
>+{
>+    g_return_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge));
>+    g_return_if_fail(user);
>+    
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+
>+    g_free(challengePrivate->user);
>+    challengePrivate->user = g_strdup(user);
>+}
>+
>+const gchar*
webkit_authentication_challenge_get_user(WebKitAuthenticationChallenge*
challenge)
>+{
>+    g_return_val_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge),
NULL);
>+
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+
>+    return challengePrivate->user;
>+}
>+
>+void
webkit_authentication_challenge_set_password(WebKitAuthenticationChallenge*
challenge, const gchar* password)
>+{
>+    g_return_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge));
>+    g_return_if_fail(password);
>+    
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+
>+    g_free(challengePrivate->password);
>+    challengePrivate->password = g_strdup(password);
>+}
>+
>+const gchar*
webkit_authentication_challenge_get_password(WebKitAuthenticationChallenge*
challenge)
>+{
>+    g_return_val_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge),
NULL);
>+
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);

^ We changed coding style when you were gone :-) We now use a direct struct
reference to ->priv. You'll need to take a look at the other classes to see how
it's done and update this patch.


>+
>+    return challengePrivate->password;
>+}
>+
>+void
webkit_authentication_challenge_use_credential(WebKitAuthenticationChallenge*
challenge)
>+{
>+    g_return_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge));
>+
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+    Credential credential = Credential(challengePrivate->user,
>+					 challengePrivate->password,
>+					 CredentialPersistenceForSession);

^ Careful, you need to use String::fromUTF8() here and for every other string
conversion in this patch. I filed Bug #17432 to get this harmful implicit
conversion removed, but till then you need to be vigilant.



>+   
challengePrivate->webHandle->receivedCredential(*challengePrivate->webChallenge
, credential);
>+}
>+
>+void
webkit_authentication_challenge_continue_without_credential(WebKitAuthenticatio
nChallenge* challenge)
>+{
>+    g_return_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge));
>+
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+   
challengePrivate->webHandle->receivedRequestToContinueWithoutCredential(*challe
ngePrivate->webChallenge);
>+}
>+
>+void webkit_authentication_challenge_cancel(WebKitAuthenticationChallenge*
challenge)
>+{
>+    g_return_if_fail(WEBKIT_IS_AUTHENTICATION_CHALLENGE(challenge));
>+
>+    WebKitAuthenticationChallengePrivate* challengePrivate =
WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(challenge);
>+
>+   
challengePrivate->webHandle->receivedCancellation(*challengePrivate->webChallen
ge);
>+}
>+
>+}
>Index: WebKit/gtk/webkit/webkitauthenticationchallenge.h
>===================================================================
>--- WebKit/gtk/webkit/webkitauthenticationchallenge.h	(revision 0)
>+++ WebKit/gtk/webkit/webkitauthenticationchallenge.h	(revision 0)
>@@ -0,0 +1,73 @@
>+/*
>+ * Copyright (C) 2008 Luca Bruno
>+ *
>+ * This library is free software; you can redistribute it and/or
>+ * modify it under the terms of the GNU Library General Public
>+ * License as published by the Free Software Foundation; either
>+ * version 2 of the License, or (at your option) any later version.
>+ *
>+ * This library is distributed in the hope that it will be useful,
>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+ * Library General Public License for more details.
>+ *
>+ * You should have received a copy of the GNU Library General Public License
>+ * along with this library; see the file COPYING.LIB.  If not, write to
>+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
>+ * Boston, MA 02110-1301, USA.
>+ */
>+
>+#ifndef WEBKIT_AUTHENTICATION_CHALLENGE_H
>+#define WEBKIT_AUTHENTICATION_CHALLENGE_H
>+
>+#include <glib-object.h>
>+
>+#include "webkitdefines.h"
>+
>+G_BEGIN_DECLS
>+
>+#define WEBKIT_TYPE_AUTHENTICATION_CHALLENGE		 
(webkit_authentication_challenge_get_type())
>+#define WEBKIT_AUTHENTICATION_CHALLENGE(obj)		  
(G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_AUTHENTICATION_CHALLENGE,
WebKitAuthenticationChallenge))
>+#define WEBKIT_AUTHENTICATION_CHALLENGE_CLASS(klass)	  
(G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_AUTHENTICATION_CHALLENGE,
WebKitAuthenticationChallengeClass))
>+#define WEBKIT_IS_AUTHENTICATION_CHALLENGE(obj)	 
(G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_AUTHENTICATION_CHALLENGE))
>+#define WEBKIT_IS_AUTHENTICATION_CHALLENGE_CLASS(klass)
(G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_AUTHENTICATION_CHALLENGE))
>+#define WEBKIT_AUTHENTICATION_CHALLENGE_GET_CLASS(obj) 
(G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_AUTHENTICATION_CHALLENGE,
WebKitAuthenticationChallengeClass))
>+
>+struct _WebKitAuthenticationChallenge {
>+    GObject parent;
>+};
>+
>+struct _WebKitAuthenticationChallengeClass {
>+    GObjectClass parent;
>+};
>+
>+WEBKIT_API GType
>+webkit_authentication_challenge_get_type (void);
>+
>+WEBKIT_API WebKitAuthenticationChallenge*
>+webkit_authentication_challenge_new ();
>+
>+WEBKIT_API void
>+webkit_authentication_challenge_set_user (WebKitAuthenticationChallenge*
challenge, const gchar* user);
>+
>+WEBKIT_API const gchar*
>+webkit_authentication_challenge_get_user (WebKitAuthenticationChallenge*
challenge);
>+
>+WEBKIT_API void
>+webkit_authentication_challenge_set_password (WebKitAuthenticationChallenge*
challenge, const gchar* password);
>+
>+WEBKIT_API const gchar*
>+webkit_authentication_challenge_get_password (WebKitAuthenticationChallenge*
challenge);
>+
>+WEBKIT_API void
>+webkit_authentication_challenge_use_credential
(WebKitAuthenticationChallenge* challenge);
>+
>+WEBKIT_API void
>+webkit_authentication_challenge_continue_without_credential
(WebKitAuthenticationChallenge* challenge);
>+
>+WEBKIT_API void
>+webkit_authentication_challenge_cancel (WebKitAuthenticationChallenge*
challenge);
>+
>+G_END_DECLS
>+
>+#endif
>Index: WebKit/gtk/webkit/webkitdefines.h
>===================================================================
>--- WebKit/gtk/webkit/webkitdefines.h	(revision 30340)
>+++ WebKit/gtk/webkit/webkitdefines.h	(working copy)
>@@ -40,6 +40,9 @@
> 
> G_BEGIN_DECLS
> 
>+typedef struct _WebKitAuthenticationChallenge WebKitAuthenticationChallenge;
>+typedef struct _WebKitAuthenticationChallengeClass
WebKitAuthenticationChallengeClass;
>+
> typedef struct _WebKitNetworkRequest WebKitNetworkRequest;
> typedef struct _WebKitNetworkRequestClass WebKitNetworkRequestClass;
> 
>Index: WebKit/gtk/webkit/webkitprivate.h
>===================================================================
>--- WebKit/gtk/webkit/webkitprivate.h	(revision 30340)
>+++ WebKit/gtk/webkit/webkitprivate.h	(working copy)
>@@ -26,6 +26,7 @@
>  * They are using WebCore which musn't be exposed to the outer world.
>  */
> 
>+#include <webkit/webkitauthenticationchallenge.h>
> #include <webkit/webkitdefines.h>
> #include <webkit/webkitwebview.h>
> #include <webkit/webkitwebframe.h>
>@@ -33,6 +34,7 @@
> #include <webkit/webkitnetworkrequest.h>
> #include <webkit/webkitwebbackforwardlist.h>
> 
>+#include "AuthenticationChallenge.h"
> #include "BackForwardList.h"
> #include "HistoryItem.h"
> #include "Settings.h"
>@@ -103,6 +105,15 @@ extern "C" {
>     struct _WebKitNetworkRequestPrivate {
>	  gchar* uri;
>     };
>+ 
>+    #define WEBKIT_AUTHENTICATION_CHALLENGE_GET_PRIVATE(obj)	 
(G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_AUTHENTICATION_CHALLENGE,
WebKitAuthenticationChallengePrivate))
>+    typedef struct _WebKitAuthenticationChallengePrivate
WebKitAuthenticationChallengePrivate;
>+    struct _WebKitAuthenticationChallengePrivate {
>+	  WebCore::AuthenticationChallenge* webChallenge;
>+	  WebCore::ResourceHandle* webHandle;
>+	  gchar* user;
>+	  gchar* password;
>+    };
> 
>     WebKitWebFrame*
>     webkit_web_frame_init_with_web_view(WebKitWebView*,
WebCore::HTMLFrameOwnerElement*);
>Index: WebKit/gtk/webkit/webkitwebview.cpp
>===================================================================
>--- WebKit/gtk/webkit/webkitwebview.cpp	(revision 30340)
>+++ WebKit/gtk/webkit/webkitwebview.cpp	(working copy)
>@@ -85,6 +85,7 @@ enum {
>     COPY_CLIPBOARD,
>     PASTE_CLIPBOARD,
>     CUT_CLIPBOARD,
>+    AUTHENTICATION_REQUESTED,
>     LAST_SIGNAL
> };
> 
>@@ -379,7 +380,7 @@ static gboolean webkit_web_view_focus_in
>     GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
>     if (GTK_WIDGET_TOPLEVEL(toplevel) &&
gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
>	  WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
>-
>+	  
>	  Frame* frame = core(webView)->mainFrame();
>	  core(webView)->focusController()->setActive(frame);
>     }
>@@ -605,6 +606,82 @@ static void webkit_web_view_real_paste_c
>     frame->editor()->command("Paste").execute();
> }
> 
>+typedef struct
>+{
>+    GtkWidget* user_entry;
>+    GtkWidget* password_entry;
>+    WebKitAuthenticationChallenge* challenge;
>+} AuthenticationDialogData;
>+
>+static void webkit_web_view_authentication_dialog_response_cb(GtkWidget*
dialog, gint response, gpointer user_data)
>+{
>+    AuthenticationDialogData* data =
reinterpret_cast<AuthenticationDialogData*>(user_data);
>+
>+    switch (response) {
>+    case GTK_RESPONSE_NONE:
>+    case GTK_RESPONSE_DELETE_EVENT:
>+    case GTK_RESPONSE_REJECT:
>+	 
webkit_authentication_challenge_continue_without_credential(data->challenge);
>+	  break;
>+    case GTK_RESPONSE_ACCEPT:
>+	  webkit_authentication_challenge_set_user(data->challenge,
>+						  
gtk_entry_get_text(GTK_ENTRY(data->user_entry)));
>+	  webkit_authentication_challenge_set_password(data->challenge,
>+						      
gtk_entry_get_text(GTK_ENTRY(data->password_entry)));
>+	  webkit_authentication_challenge_use_credential(data->challenge);
>+	  break;
>+    default:
>+	  g_assert_not_reached ();
>+	  break;
>+    }
>+
>+    gtk_widget_destroy(dialog);
>+    g_object_unref(data->challenge);
>+}
>+
>+static void webkit_web_view_real_authentication_requested(WebKitWebView*
webView, WebKitWebFrame* webFrame,
>+							   
WebKitAuthenticationChallenge* challenge)
>+{
>+    GtkWidget* window;
>+    GtkWidget* dialog;
>+    GtkWidget* table;
>+    GtkWidget* label;
>+    AuthenticationDialogData* data;
>+
>+    window = gtk_widget_get_toplevel(GTK_WIDGET(webView));
>+    gchar* title = g_strconcat("Authentication - ",
webkit_web_frame_get_uri(webFrame), NULL);
>+    dialog = gtk_dialog_new_with_buttons(title, GTK_WIDGET_TOPLEVEL(window) ?
GTK_WINDOW(window) : 0,
>+					   (GtkDialogFlags)(GTK_DIALOG_MODAL |
GTK_DIALOG_DESTROY_WITH_PARENT),
>+					   GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
>+					   GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT,
>+					   NULL);
>+    g_free(title);
>+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);

>+
>+    data = g_new(AuthenticationDialogData, 1);
>+    data->user_entry = gtk_entry_new();
>+    data->password_entry = gtk_entry_new();
>+    gtk_entry_set_visibility(GTK_ENTRY(data->password_entry), FALSE);
>+    data->challenge = challenge;
>+    g_signal_connect(dialog, "response",
G_CALLBACK(webkit_web_view_authentication_dialog_response_cb), data);
>+
>+    table = gtk_table_new(2, 2, FALSE);
>+    gtk_table_set_col_spacings(GTK_TABLE(table), 3);
>+    gtk_table_set_row_spacings(GTK_TABLE(table), 3);
>+
>+    label = gtk_label_new("Username:");
>+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
>+    gtk_table_attach_defaults(GTK_TABLE(table), data->user_entry, 1, 2, 0,
1);
>+
>+    label = gtk_label_new("Password:");
>+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
>+    gtk_table_attach_defaults(GTK_TABLE(table), data->password_entry, 1, 2,
1, 2);
>+
>+    gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
>+    gtk_widget_show_all(table);
>+    gtk_widget_show(dialog);
>+}
>+
> static void webkit_web_view_finalize(GObject* object)
> {
>     WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
>@@ -971,6 +1048,25 @@ static void webkit_web_view_class_init(W
>	      g_cclosure_marshal_VOID__VOID,
>	      G_TYPE_NONE, 0);
> 
>+    /**
>+     * WebKitWebView::authentication-requested:
>+     * @web_view: the object which received the signal
>+     *
>+     * The ::authentication-requested signal is emitted when an
authentication is
>+     * requested from the server to access a resource.
>+     *
>+     * The default behavior for this signal is creating an input dialog to
get a suitable credential.
>+     */
>+    webkit_web_view_signals[AUTHENTICATION_REQUESTED] =
g_signal_new("authentication-requested",
>+	      G_TYPE_FROM_CLASS(webViewClass),
>+	      (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
>+	      G_STRUCT_OFFSET(WebKitWebViewClass, authentication_requested),
>+	      NULL, NULL,
>+	      webkit_marshal_VOID__OBJECT_OBJECT,
>+	      G_TYPE_NONE, 2,
>+	      WEBKIT_TYPE_WEB_FRAME,
>+	      WEBKIT_TYPE_AUTHENTICATION_CHALLENGE);
>+
>     /*
>      * implementations of virtual methods
>      */
>@@ -986,6 +1082,7 @@ static void webkit_web_view_class_init(W
>     webViewClass->cut_clipboard = webkit_web_view_real_cut_clipboard;
>     webViewClass->copy_clipboard = webkit_web_view_real_copy_clipboard;
>     webViewClass->paste_clipboard = webkit_web_view_real_paste_clipboard;
>+    webViewClass->authentication_requested =
webkit_web_view_real_authentication_requested;
> 
>     GObjectClass* objectClass = G_OBJECT_CLASS(webViewClass);
>     objectClass->finalize = webkit_web_view_finalize;
>Index: WebKit/gtk/webkit/webkitwebview.h
>===================================================================
>--- WebKit/gtk/webkit/webkitwebview.h	(revision 30340)
>+++ WebKit/gtk/webkit/webkitwebview.h	(working copy)
>@@ -83,6 +83,7 @@ struct _WebKitWebViewClass {
>     void (*cut_clipboard) (WebKitWebView* web_view);
>     void (*copy_clipboard) (WebKitWebView* web_view);
>     void (*paste_clipboard) (WebKitWebView* web_view);
>+    void (*authentication_requested) (WebKitWebView* web_view,
WebKitWebFrame* web_frame, WebKitAuthenticationChallenge*
authentication_challenge);
> 
>     /*
>      * internal




I think apart from these issues the patch is good to go. Looking forward to
seeing the revised patch.


More information about the webkit-reviews mailing list