| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/network/cert_loader.h" | 5 #include "chromeos/network/cert_loader.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/chromeos/chromeos_version.h" | 9 #include "base/chromeos/chromeos_version.h" |
| 10 #include "base/observer_list.h" | 10 #include "base/observer_list.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 return next_delay; | 41 return next_delay; |
| 42 } | 42 } |
| 43 | 43 |
| 44 void LoadNSSCertificates(net::CertificateList* cert_list) { | 44 void LoadNSSCertificates(net::CertificateList* cert_list) { |
| 45 if (base::chromeos::IsRunningOnChromeOS()) | 45 if (base::chromeos::IsRunningOnChromeOS()) |
| 46 net::NSSCertDatabase::GetInstance()->ListCerts(cert_list); | 46 net::NSSCertDatabase::GetInstance()->ListCerts(cert_list); |
| 47 } | 47 } |
| 48 | 48 |
| 49 } // namespace | 49 } // namespace |
| 50 | 50 |
| 51 static CertLoader* g_cert_loader = NULL; | |
| 52 | |
| 53 // static | |
| 54 void CertLoader::Initialize() { | |
| 55 CHECK(!g_cert_loader); | |
| 56 g_cert_loader = new CertLoader(); | |
| 57 } | |
| 58 | |
| 59 // static | |
| 60 void CertLoader::Shutdown() { | |
| 61 CHECK(g_cert_loader); | |
| 62 delete g_cert_loader; | |
| 63 g_cert_loader = NULL; | |
| 64 } | |
| 65 | |
| 66 // static | |
| 67 CertLoader* CertLoader::Get() { | |
| 68 CHECK(g_cert_loader) << "CertLoader::Get() called before Initialize()"; | |
| 69 return g_cert_loader; | |
| 70 } | |
| 71 | |
| 72 // static | |
| 73 bool CertLoader::IsInitialized() { | |
| 74 return g_cert_loader; | |
| 75 } | |
| 76 | |
| 77 CertLoader::CertLoader() | 51 CertLoader::CertLoader() |
| 78 : certificates_requested_(false), | 52 : certificates_requested_(false), |
| 79 certificates_loaded_(false), | 53 certificates_loaded_(false), |
| 80 certificates_update_required_(false), | 54 certificates_update_required_(false), |
| 81 certificates_update_running_(false), | 55 certificates_update_running_(false), |
| 82 tpm_token_state_(TPM_STATE_UNKNOWN), | 56 tpm_token_state_(TPM_STATE_UNKNOWN), |
| 83 tpm_request_delay_( | 57 tpm_request_delay_( |
| 84 base::TimeDelta::FromMilliseconds(kInitialRequestDelayMs)), | 58 base::TimeDelta::FromMilliseconds(kInitialRequestDelayMs)), |
| 85 initialize_token_factory_(this), | 59 initialize_token_factory_(this), |
| 86 update_certificates_factory_(this) { | 60 update_certificates_factory_(this) { |
| 87 net::CertDatabase::GetInstance()->AddObserver(this); | 61 net::CertDatabase::GetInstance()->AddObserver(this); |
| 88 LoginState::Get()->AddObserver(this); | 62 if (LoginState::IsInitialized()) |
| 63 LoginState::Get()->AddObserver(this); |
| 89 RequestCertificates(); | 64 RequestCertificates(); |
| 90 } | 65 } |
| 91 | 66 |
| 92 CertLoader::~CertLoader() { | 67 CertLoader::~CertLoader() { |
| 93 net::CertDatabase::GetInstance()->RemoveObserver(this); | 68 net::CertDatabase::GetInstance()->RemoveObserver(this); |
| 94 LoginState::Get()->RemoveObserver(this); | 69 if (LoginState::IsInitialized()) |
| 70 LoginState::Get()->RemoveObserver(this); |
| 95 } | 71 } |
| 96 | 72 |
| 97 void CertLoader::AddObserver(CertLoader::Observer* observer) { | 73 void CertLoader::AddObserver(CertLoader::Observer* observer) { |
| 98 observers_.AddObserver(observer); | 74 observers_.AddObserver(observer); |
| 99 } | 75 } |
| 100 | 76 |
| 101 void CertLoader::RemoveObserver(CertLoader::Observer* observer) { | 77 void CertLoader::RemoveObserver(CertLoader::Observer* observer) { |
| 102 observers_.RemoveObserver(observer); | 78 observers_.RemoveObserver(observer); |
| 103 } | 79 } |
| 104 | 80 |
| 105 bool CertLoader::CertificatesLoading() const { | 81 bool CertLoader::CertificatesLoading() const { |
| 106 return certificates_requested_ && !certificates_loaded_; | 82 return certificates_requested_ && !certificates_loaded_; |
| 107 } | 83 } |
| 108 | 84 |
| 109 bool CertLoader::IsHardwareBacked() const { | 85 bool CertLoader::IsHardwareBacked() const { |
| 110 return !tpm_token_name_.empty(); | 86 return !tpm_token_name_.empty(); |
| 111 } | 87 } |
| 112 | 88 |
| 113 void CertLoader::RequestCertificates() { | 89 void CertLoader::RequestCertificates() { |
| 114 CHECK(thread_checker_.CalledOnValidThread()); | 90 CHECK(thread_checker_.CalledOnValidThread()); |
| 115 VLOG(1) << "RequestCertificates: " << LoginState::Get()->IsUserLoggedIn(); | 91 const bool logged_in = LoginState::IsInitialized() ? |
| 116 if (certificates_requested_ || !LoginState::Get()->IsUserLoggedIn()) | 92 LoginState::Get()->IsUserLoggedIn() : false; |
| 93 VLOG(1) << "RequestCertificates: " << logged_in; |
| 94 if (certificates_requested_ || !logged_in) |
| 117 return; | 95 return; |
| 118 | 96 |
| 119 certificates_requested_ = true; | 97 certificates_requested_ = true; |
| 120 | 98 |
| 121 // Ensure we've opened the user's key/certificate database. | 99 // Ensure we've opened the user's key/certificate database. |
| 122 crypto::OpenPersistentNSSDB(); | 100 crypto::OpenPersistentNSSDB(); |
| 123 if (base::chromeos::IsRunningOnChromeOS()) | 101 if (base::chromeos::IsRunningOnChromeOS()) |
| 124 crypto::EnableTPMTokenForNSS(); | 102 crypto::EnableTPMTokenForNSS(); |
| 125 | 103 |
| 126 // This is the entry point to the TPM token initialization process, which we | 104 // This is the entry point to the TPM token initialization process, which we |
| 127 // should do at most once. | 105 // should do at most once. |
| 128 DCHECK(!initialize_token_factory_.HasWeakPtrs()); | 106 DCHECK(!initialize_token_factory_.HasWeakPtrs()); |
| 129 InitializeTokenAndLoadCertificates(); | 107 InitializeTokenAndLoadCertificates(); |
| 130 } | 108 } |
| 131 | 109 |
| 132 void CertLoader::InitializeTokenAndLoadCertificates() { | 110 void CertLoader::InitializeTokenAndLoadCertificates() { |
| 133 CHECK(thread_checker_.CalledOnValidThread()); | 111 CHECK(thread_checker_.CalledOnValidThread()); |
| 134 VLOG(1) << "InitializeTokenAndLoadCertificates"; | 112 VLOG(1) << "InitializeTokenAndLoadCertificates"; |
| 135 | 113 |
| 136 switch(tpm_token_state_) { | 114 switch (tpm_token_state_) { |
| 137 case TPM_STATE_UNKNOWN: { | 115 case TPM_STATE_UNKNOWN: { |
| 138 DBusThreadManager::Get()->GetCryptohomeClient()->TpmIsEnabled( | 116 DBusThreadManager::Get()->GetCryptohomeClient()->TpmIsEnabled( |
| 139 base::Bind(&CertLoader::OnTpmIsEnabled, | 117 base::Bind(&CertLoader::OnTpmIsEnabled, |
| 140 initialize_token_factory_.GetWeakPtr())); | 118 initialize_token_factory_.GetWeakPtr())); |
| 141 return; | 119 return; |
| 142 } | 120 } |
| 143 case TPM_DISABLED: { | 121 case TPM_DISABLED: { |
| 144 // TPM is disabled, so proceed with empty tpm token name. | 122 // TPM is disabled, so proceed with empty tpm token name. |
| 145 StartLoadCertificates(); | 123 StartLoadCertificates(); |
| 146 return; | 124 return; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 VLOG(1) << "OnCertRemoved"; | 299 VLOG(1) << "OnCertRemoved"; |
| 322 StartLoadCertificates(); | 300 StartLoadCertificates(); |
| 323 } | 301 } |
| 324 | 302 |
| 325 void CertLoader::LoggedInStateChanged(LoginState::LoggedInState state) { | 303 void CertLoader::LoggedInStateChanged(LoginState::LoggedInState state) { |
| 326 VLOG(1) << "LoggedInStateChanged: " << state; | 304 VLOG(1) << "LoggedInStateChanged: " << state; |
| 327 RequestCertificates(); | 305 RequestCertificates(); |
| 328 } | 306 } |
| 329 | 307 |
| 330 } // namespace chromeos | 308 } // namespace chromeos |
| OLD | NEW |