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