OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/chromeos/login/ownership_service.h" | 5 #include "chrome/browser/chromeos/login/ownership_service.h" |
6 | 6 |
| 7 #include "base/command_line.h" |
7 #include "base/bind.h" | 8 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
9 #include "base/file_path.h" | 10 #include "base/file_path.h" |
10 #include "base/file_util.h" | 11 #include "base/file_util.h" |
11 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
12 #include "base/synchronization/lock.h" | 13 #include "base/synchronization/lock.h" |
13 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
14 #include "chrome/common/chrome_notification_types.h" | 15 #include "chrome/common/chrome_notification_types.h" |
| 16 #include "chrome/common/chrome_switches.h" |
15 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
16 #include "content/public/browser/notification_service.h" | 18 #include "content/public/browser/notification_service.h" |
17 | 19 |
18 using content::BrowserThread; | 20 using content::BrowserThread; |
19 | 21 |
20 namespace chromeos { | 22 namespace chromeos { |
21 | 23 |
22 static base::LazyInstance<OwnershipService> g_ownership_service = | 24 static base::LazyInstance<OwnershipService> g_ownership_service = |
23 LAZY_INSTANCE_INITIALIZER; | 25 LAZY_INSTANCE_INITIALIZER; |
24 | 26 |
25 // static | 27 // static |
26 OwnershipService* OwnershipService::GetSharedInstance() { | 28 OwnershipService* OwnershipService::GetSharedInstance() { |
27 return g_ownership_service.Pointer(); | 29 return g_ownership_service.Pointer(); |
28 } | 30 } |
29 | 31 |
30 OwnershipService::OwnershipService() | 32 OwnershipService::OwnershipService() |
31 : manager_(new OwnerManager), | 33 : manager_(new OwnerManager), |
32 utils_(OwnerKeyUtils::Create()), | 34 utils_(OwnerKeyUtils::Create()), |
33 ownership_status_(OWNERSHIP_UNKNOWN) { | 35 ownership_status_(OWNERSHIP_UNKNOWN), |
| 36 force_ownership_(CommandLine::ForCurrentProcess()->HasSwitch( |
| 37 switches::kStubCrosSettings)) { |
34 notification_registrar_.Add( | 38 notification_registrar_.Add( |
35 this, | 39 this, |
36 chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED, | 40 chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED, |
37 content::NotificationService::AllSources()); | 41 content::NotificationService::AllSources()); |
38 } | 42 } |
39 | 43 |
40 OwnershipService::~OwnershipService() {} | 44 OwnershipService::~OwnershipService() {} |
41 | 45 |
42 void OwnershipService::Prewarm() { | 46 void OwnershipService::Prewarm() { |
43 // Note that we cannot prewarm in constructor because in current codebase | 47 // Note that we cannot prewarm in constructor because in current codebase |
(...skipping 10 matching lines...) Expand all Loading... |
54 // DISABLE_RUNNABLE_METHOD_REFCOUNT. So avoid posting task in those | 58 // DISABLE_RUNNABLE_METHOD_REFCOUNT. So avoid posting task in those |
55 // circumstances in order to avoid accessing already deleted object. | 59 // circumstances in order to avoid accessing already deleted object. |
56 } | 60 } |
57 } | 61 } |
58 | 62 |
59 bool OwnershipService::IsAlreadyOwned() { | 63 bool OwnershipService::IsAlreadyOwned() { |
60 return file_util::PathExists(utils_->GetOwnerKeyFilePath()); | 64 return file_util::PathExists(utils_->GetOwnerKeyFilePath()); |
61 } | 65 } |
62 | 66 |
63 OwnershipService::Status OwnershipService::GetStatus(bool blocking) { | 67 OwnershipService::Status OwnershipService::GetStatus(bool blocking) { |
| 68 if (force_ownership_) |
| 69 return OWNERSHIP_TAKEN; |
64 Status status = OWNERSHIP_UNKNOWN; | 70 Status status = OWNERSHIP_UNKNOWN; |
65 bool is_owned = false; | 71 bool is_owned = false; |
66 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 72 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
67 ownership_status_lock_.Acquire(); | 73 ownership_status_lock_.Acquire(); |
68 status = ownership_status_; | 74 status = ownership_status_; |
69 ownership_status_lock_.Release(); | 75 ownership_status_lock_.Release(); |
70 if (status != OWNERSHIP_UNKNOWN || !blocking) | 76 if (status != OWNERSHIP_UNKNOWN || !blocking) |
71 return status; | 77 return status; |
72 // Under common usage there is very short lapse of time when ownership | 78 // Under common usage there is very short lapse of time when ownership |
73 // status is still unknown after constructing OwnershipService. | 79 // status is still unknown after constructing OwnershipService. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 const content::NotificationDetails& details) { | 137 const content::NotificationDetails& details) { |
132 if (type == chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED) { | 138 if (type == chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED) { |
133 SetStatus(OWNERSHIP_TAKEN); | 139 SetStatus(OWNERSHIP_TAKEN); |
134 notification_registrar_.RemoveAll(); | 140 notification_registrar_.RemoveAll(); |
135 } else { | 141 } else { |
136 NOTREACHED(); | 142 NOTREACHED(); |
137 } | 143 } |
138 } | 144 } |
139 | 145 |
140 bool OwnershipService::CurrentUserIsOwner() { | 146 bool OwnershipService::CurrentUserIsOwner() { |
| 147 if (force_ownership_) |
| 148 return true; |
141 // If this user has the private key associated with the owner's | 149 // If this user has the private key associated with the owner's |
142 // public key, this user is the owner. | 150 // public key, this user is the owner. |
143 return IsAlreadyOwned() && manager_->EnsurePrivateKey(); | 151 return IsAlreadyOwned() && manager_->EnsurePrivateKey(); |
144 } | 152 } |
145 | 153 |
146 // static | 154 // static |
147 void OwnershipService::UpdateOwnerKey(OwnershipService* service, | 155 void OwnershipService::UpdateOwnerKey(OwnershipService* service, |
148 const BrowserThread::ID thread_id, | 156 const BrowserThread::ID thread_id, |
149 const std::vector<uint8>& new_key, | 157 const std::vector<uint8>& new_key, |
150 OwnerManager::KeyUpdateDelegate* d) { | 158 OwnerManager::KeyUpdateDelegate* d) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 SetStatus(status); | 214 SetStatus(status); |
207 } | 215 } |
208 | 216 |
209 void OwnershipService::SetStatus(Status new_status) { | 217 void OwnershipService::SetStatus(Status new_status) { |
210 DCHECK(new_status == OWNERSHIP_TAKEN || new_status == OWNERSHIP_NONE); | 218 DCHECK(new_status == OWNERSHIP_TAKEN || new_status == OWNERSHIP_NONE); |
211 base::AutoLock lk(ownership_status_lock_); | 219 base::AutoLock lk(ownership_status_lock_); |
212 ownership_status_ = new_status; | 220 ownership_status_ = new_status; |
213 } | 221 } |
214 | 222 |
215 } // namespace chromeos | 223 } // namespace chromeos |
OLD | NEW |