summaryrefslogtreecommitdiffstats
path: root/net/base/ssl_config_service_win.cc
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-19 21:48:42 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-19 21:48:42 +0000
commitdb36938cb26cf265a5fd93690a8e783d01406958 (patch)
tree7261d389592cdfbbb3063f223455518db12d3bda /net/base/ssl_config_service_win.cc
parent0d1872ebba9b790f3a33bcaecc11258ea924b397 (diff)
downloadchromium_src-db36938cb26cf265a5fd93690a8e783d01406958.zip
chromium_src-db36938cb26cf265a5fd93690a8e783d01406958.tar.gz
chromium_src-db36938cb26cf265a5fd93690a8e783d01406958.tar.bz2
Pref-backed SSLConfigService for Linux.
Makes SSLConfigService into a ref-counted interface, and makes Profile own an SSLConfigServiceFactory which is used to create the SSLConfigService and pass it through the URLRequestContext on down to where it is actually used. R=eroman,wtc BUG=11507,19290 Review URL: http://codereview.chromium.org/165003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23757 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/ssl_config_service_win.cc')
-rw-r--r--net/base/ssl_config_service_win.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/net/base/ssl_config_service_win.cc b/net/base/ssl_config_service_win.cc
new file mode 100644
index 0000000..dcb9b89
--- /dev/null
+++ b/net/base/ssl_config_service_win.cc
@@ -0,0 +1,114 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/base/ssl_config_service_win.h"
+
+#include "base/registry.h"
+
+using base::TimeDelta;
+using base::TimeTicks;
+
+namespace net {
+
+static const int kConfigUpdateInterval = 10; // seconds
+
+static const wchar_t kInternetSettingsSubKeyName[] =
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
+
+static const wchar_t kRevocationValueName[] = L"CertificateRevocation";
+
+static const wchar_t kProtocolsValueName[] = L"SecureProtocols";
+
+// In SecureProtocols, each SSL version is represented by a bit:
+// SSL 2.0: 0x08
+// SSL 3.0: 0x20
+// TLS 1.0: 0x80
+// The bits are OR'ed to form the DWORD value. So 0xa0 means SSL 3.0 and
+// TLS 1.0.
+enum {
+ SSL2 = 0x08,
+ SSL3 = 0x20,
+ TLS1 = 0x80
+};
+
+// If CertificateRevocation or SecureProtocols is missing, IE uses a default
+// value. Unfortunately the default is IE version specific. We use WinHTTP's
+// default.
+enum {
+ REVOCATION_DEFAULT = 0,
+ PROTOCOLS_DEFAULT = SSL3 | TLS1
+};
+
+SSLConfigServiceWin::SSLConfigServiceWin() : ever_updated_(false) {
+ // We defer retrieving the settings until the first call to GetSSLConfig, to
+ // avoid a blocking call on the UI thread.
+}
+
+SSLConfigServiceWin::SSLConfigServiceWin(TimeTicks now) : ever_updated_(false) {
+ UpdateConfig(now);
+}
+
+void SSLConfigServiceWin::GetSSLConfigAt(SSLConfig* config, TimeTicks now) {
+ if (!ever_updated_ ||
+ now - config_time_ > TimeDelta::FromSeconds(kConfigUpdateInterval))
+ UpdateConfig(now);
+ *config = config_info_;
+}
+
+// static
+bool SSLConfigServiceWin::GetSSLConfigNow(SSLConfig* config) {
+ RegKey internet_settings;
+ if (!internet_settings.Open(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_READ))
+ return false;
+
+ DWORD revocation;
+ if (!internet_settings.ReadValueDW(kRevocationValueName, &revocation))
+ revocation = REVOCATION_DEFAULT;
+
+ DWORD protocols;
+ if (!internet_settings.ReadValueDW(kProtocolsValueName, &protocols))
+ protocols = PROTOCOLS_DEFAULT;
+
+ config->rev_checking_enabled = (revocation != 0);
+ config->ssl2_enabled = ((protocols & SSL2) != 0);
+ config->ssl3_enabled = ((protocols & SSL3) != 0);
+ config->tls1_enabled = ((protocols & TLS1) != 0);
+
+ return true;
+}
+
+// static
+void SSLConfigServiceWin::SetRevCheckingEnabled(bool enabled) {
+ DWORD value = enabled;
+ RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_WRITE);
+ internet_settings.WriteValue(kRevocationValueName, value);
+ // TODO(mattm): We should call UpdateConfig after updating settings, but these
+ // methods are static.
+}
+
+// static
+void SSLConfigServiceWin::SetSSL2Enabled(bool enabled) {
+ RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_READ | KEY_WRITE);
+ DWORD value;
+ if (!internet_settings.ReadValueDW(kProtocolsValueName, &value))
+ value = PROTOCOLS_DEFAULT;
+ if (enabled)
+ value |= SSL2;
+ else
+ value &= ~SSL2;
+ internet_settings.WriteValue(kProtocolsValueName, value);
+ // TODO(mattm): We should call UpdateConfig after updating settings, but these
+ // methods are static.
+}
+
+void SSLConfigServiceWin::UpdateConfig(TimeTicks now) {
+ GetSSLConfigNow(&config_info_);
+ config_time_ = now;
+ ever_updated_ = true;
+}
+
+} // namespace net