@@ -2719,9 +2719,90 @@ static GSourceFuncs _handlerIntervention =
2719
2719
}
2720
2720
browser->OnLoadFailed (failingURI);
2721
2721
}
2722
- static bool authenticationCallback (WebKitWebView*, WebKitAuthenticationRequest* request)
2722
+ static bool authenticationCallback (WebKitWebView*, WebKitAuthenticationRequest* request, WebKitImplementation* browser )
2723
2723
{
2724
+ TRACE (Trace::Information, (" AUTHENTICATION: Started Authentication callback" ));
2725
+ // Need to check Glib version >= 2.72, otherwise return nullptr
2726
+ #if GLIB_CHECK_VERSION (2, 72, 0)
2727
+ GError *error = NULL ;
2728
+ GTlsCertificate *cert = NULL ;
2729
+ std::string clientCertStr, clientCertKeyStr;
2730
+ const gchar *certPath = NULL , *keyPath = NULL ;
2731
+
2732
+ if (browser->_config .ClientCert .IsSet () == true && browser->_config .ClientCert .Value ().empty () == false )
2733
+ {
2734
+ clientCertStr = browser->_config .ClientCert .Value ().c_str ();
2735
+ certPath = clientCertStr.c_str ();
2736
+ }
2737
+
2738
+ if (!certPath)
2739
+ goto out;
2740
+
2741
+ if (browser->_config .ClientCertKey .IsSet () == true && browser->_config .ClientCertKey .Value ().empty () == false )
2742
+ {
2743
+ clientCertKeyStr = browser->_config .ClientCertKey .Value ().c_str ();
2744
+ keyPath = clientCertKeyStr.c_str ();
2745
+ }
2746
+
2747
+ if (g_str_has_suffix (certPath, " .pk12" ))
2748
+ {
2749
+ TRACE (Trace::Information, (" AUTHENTICATION: Cert Path accepted as pk12" ));
2750
+ gchar *certData, *keyData = NULL ;
2751
+ gsize certLen, keyLen;
2752
+ if (keyPath)
2753
+ {
2754
+ gsize i;
2755
+ if (!g_file_get_contents (keyPath, &keyData, &keyLen, &error))
2756
+ goto out;
2757
+ for (i = keyLen - 1 ; i >= 0 && g_ascii_isspace (keyData[i]); --i)
2758
+ keyData[i] = ' \0 ' ;
2759
+ }
2760
+
2761
+ if (!g_file_get_contents (certPath, &certData, &certLen, &error))
2762
+ {
2763
+ g_free (keyData);
2764
+ goto out;
2765
+ }
2766
+
2767
+ cert = g_tls_certificate_new_from_pkcs12 ((guint8 *)certData, certLen, keyData, &error);
2768
+ g_free (certData);
2769
+ g_free (keyData);
2770
+ }
2771
+ else if (keyPath)
2772
+ {
2773
+ TRACE (Trace::Information, (" AUTHENTICATION: Certificate not pk12" ));
2774
+ cert = g_tls_certificate_new_from_files (certPath, keyPath, &error);
2775
+ }
2776
+ else
2777
+ {
2778
+ TRACE (Trace::Information, (" AUTHENTICATION: No key path set" ));
2779
+ cert = g_tls_certificate_new_from_file (certPath, &error);
2780
+ }
2781
+
2782
+ out:
2783
+ if (error)
2784
+ {
2785
+ TRACE (Trace::Information, (" AUTHENTICATION: Cert load failed. %s" , error ? error->message : " unknown" ));
2786
+ g_error_free (error);
2787
+ webkit_authentication_request_authenticate (request, nullptr );
2788
+ }
2789
+ else if (!cert)
2790
+ {
2791
+ TRACE (Trace::Information, (" AUTHENTICATION: No certificate provided" ));
2792
+ webkit_authentication_request_authenticate (request, nullptr );
2793
+ }
2794
+ else
2795
+ {
2796
+ TRACE (Trace::Information, (" AUTHENTICATION: Sending cert to webkit" ));
2797
+ auto *credential = webkit_credential_new_for_certificate (cert, WEBKIT_CREDENTIAL_PERSISTENCE_NONE);
2798
+ webkit_authentication_request_authenticate (request, credential);
2799
+ g_object_unref (cert);
2800
+ webkit_credential_free (credential);
2801
+ }
2802
+ #else
2803
+ TRACE (Trace::Information, (" AUTHENTICATION: Glib version check failed- Detected as not 2.7.2 or greater." ));
2724
2804
webkit_authentication_request_authenticate (request, nullptr );
2805
+ #endif
2725
2806
return TRUE ;
2726
2807
}
2727
2808
static void postExitJob ()
@@ -3099,7 +3180,7 @@ static GSourceFuncs _handlerIntervention =
3099
3180
g_signal_connect (_view, " user-message-received" , reinterpret_cast <GCallback>(userMessageReceivedCallback), this );
3100
3181
g_signal_connect (_view, " notify::is-web-process-responsive" , reinterpret_cast <GCallback>(isWebProcessResponsiveCallback), this );
3101
3182
g_signal_connect (_view, " load-failed" , reinterpret_cast <GCallback>(loadFailedCallback), this );
3102
- g_signal_connect (_view, " authenticate" , reinterpret_cast <GCallback>(authenticationCallback), nullptr );
3183
+ g_signal_connect (_view, " authenticate" , reinterpret_cast <GCallback>(authenticationCallback), this );
3103
3184
3104
3185
_configurationCompleted.SetState (true );
3105
3186
0 commit comments