15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConfigService::SSLConfigService() 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : observer_list_(ObserverList<Observer>::NOTIFY_EXISTING_ONLY) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GlobalCRLSet holds a reference to the global CRLSet. It simply wraps a lock 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// around a scoped_refptr so that getting a reference doesn't race with 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updating the CRLSet. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GlobalCRLSet { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(const scoped_refptr<CRLSet>& new_crl_set) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crl_set_ = new_crl_set; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet> Get() const { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crl_set_; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet> crl_set_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable base::Lock lock_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<GlobalCRLSet>::Leaky g_crl_set = LAZY_INSTANCE_INITIALIZER; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConfigService::SetCRLSet(scoped_refptr<CRLSet> crl_set) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this can be called concurently with GetCRLSet(). 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_crl_set.Get().Set(crl_set); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<CRLSet> SSLConfigService::GetCRLSet() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_crl_set.Get().Get(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConfigService::AddObserver(Observer* observer) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_.AddObserver(observer); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConfigService::RemoveObserver(Observer* observer) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_.RemoveObserver(observer); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SSLConfigService::NotifySSLConfigChange() { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(Observer, observer_list_, OnSSLConfigChanged()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConfigService::~SSLConfigService() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConfigService::ProcessConfigUpdate(const SSLConfig& orig_config, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& new_config) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool config_changed = 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (orig_config.rev_checking_enabled != new_config.rev_checking_enabled) || 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch (orig_config.rev_checking_required_local_anchors != 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new_config.rev_checking_required_local_anchors) || 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (orig_config.version_min != new_config.version_min) || 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (orig_config.version_max != new_config.version_max) || 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (orig_config.disabled_cipher_suites != 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new_config.disabled_cipher_suites) || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (orig_config.channel_id_enabled != new_config.channel_id_enabled) || 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (orig_config.false_start_enabled != new_config.false_start_enabled) || 770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) (orig_config.require_forward_secrecy != 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new_config.require_forward_secrecy); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_changed) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifySSLConfigChange(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 85