Chromium Code Reviews| Index: chrome/browser/policy/device_policy_identity_strategy.cc |
| diff --git a/chrome/browser/policy/device_policy_identity_strategy.cc b/chrome/browser/policy/device_policy_identity_strategy.cc |
| index 0f199450979ed41f9364aa4a4d5e92c9e96628b3..b27ff4a2238c482996b3f04e5611195dea3f5a06 100644 |
| --- a/chrome/browser/policy/device_policy_identity_strategy.cc |
| +++ b/chrome/browser/policy/device_policy_identity_strategy.cc |
| @@ -8,16 +8,86 @@ |
| #include "chrome/browser/chromeos/login/ownership_service.h" |
| #include "chrome/browser/chromeos/login/user_manager.h" |
| #include "chrome/browser/net/gaia/token_service.h" |
| +#include "chrome/browser/policy/proto/device_management_constants.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| +#include "chrome/common/guid.h" |
| #include "chrome/common/net/gaia/gaia_constants.h" |
| #include "chrome/common/notification_service.h" |
| #include "chrome/common/notification_type.h" |
| namespace policy { |
| +// Responsible for querying device ownership on the FILE thread. |
| +class DevicePolicyIdentityStrategy::OwnershipChecker |
| + : public base::RefCountedThreadSafe< |
| + DevicePolicyIdentityStrategy::OwnershipChecker> { |
| + public: |
| + explicit OwnershipChecker(DevicePolicyIdentityStrategy* callback) |
|
Mattias Nissler (ping if slow)
2011/03/01 10:25:49
hm, it's not really a callback, so why not just na
gfeher
2011/03/01 15:53:00
Done.
|
| + : callback_(callback) { |
| + } |
| + |
| + // Initiates a query on the file thread to check if the currently logged in |
| + // user is the owner. |
| + void CheckCurrentUserIsOwner(); |
| + |
| + // Cancels the query. |
| + void Cancel(); |
|
Mattias Nissler (ping if slow)
2011/03/01 10:25:49
You can make use of base::WeakPtr instead, that ha
gfeher
2011/03/01 15:53:00
Done.
|
| + |
| + private: |
| + void CheckOnFileThread(); |
| + void CallbackOnUIThread(bool current_user_is_owner); |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<OwnershipChecker>; |
| + |
| + ~OwnershipChecker() {} |
| + |
| + // The object to be called back with the result. |
| + DevicePolicyIdentityStrategy* callback_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(OwnershipChecker); |
| +}; |
| + |
| +void DevicePolicyIdentityStrategy::OwnershipChecker::CheckCurrentUserIsOwner() { |
| + if (callback_ == NULL) |
| + return; |
| + BrowserThread::PostTask( |
| + BrowserThread::FILE, |
| + FROM_HERE, |
| + NewRunnableMethod( |
| + this, |
| + &DevicePolicyIdentityStrategy::OwnershipChecker::CheckOnFileThread)); |
| +} |
| + |
| +void DevicePolicyIdentityStrategy::OwnershipChecker::CheckOnFileThread() { |
| + bool current_user_is_owner = |
| + chromeos::OwnershipService::GetSharedInstance()->CurrentUserIsOwner(); |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + NewRunnableMethod( |
| + this, |
| + &DevicePolicyIdentityStrategy::OwnershipChecker::CallbackOnUIThread, |
| + current_user_is_owner)); |
| +} |
| + |
| +void DevicePolicyIdentityStrategy::OwnershipChecker::CallbackOnUIThread( |
| + bool current_user_is_owner) { |
| + if (callback_ != NULL) { |
| + callback_->OnOwnershipInformationAvailable(current_user_is_owner); |
| + callback_ = NULL; |
| + } |
| +} |
| + |
| +void DevicePolicyIdentityStrategy::OwnershipChecker::Cancel() { |
| + callback_ = NULL; |
| +} |
| + |
| DevicePolicyIdentityStrategy::DevicePolicyIdentityStrategy() |
| - : should_register_(false) { |
| + : should_register_(false), |
| + current_user_is_owner_(false), |
| + ownership_checker_(NULL) { |
| registrar_.Add(this, |
| NotificationType::TOKEN_AVAILABLE, |
| NotificationService::AllSources()); |
| @@ -35,14 +105,49 @@ DevicePolicyIdentityStrategy::DevicePolicyIdentityStrategy() |
| machine_id_ = "dummy-cros-machine-ID"; |
| } |
| +DevicePolicyIdentityStrategy::~DevicePolicyIdentityStrategy() { |
| + if (ownership_checker_) |
| + ownership_checker_->Cancel(); |
| +} |
| + |
| +void DevicePolicyIdentityStrategy::OnOwnershipInformationAvailable( |
| + bool current_user_is_owner) { |
| + current_user_is_owner_ = current_user_is_owner; |
| + CheckAndTriggerFetch(); |
| +} |
| + |
| +void DevicePolicyIdentityStrategy::CheckOwnershipAndTriggerFetch() { |
| + // Cancel any pending queries. |
| + if (ownership_checker_) |
| + ownership_checker_->Cancel(); |
| + // Set to false until we know that the current user is the owner. |
| + current_user_is_owner_ = false; |
| + // Issue a new query. |
| + ownership_checker_ = new OwnershipChecker(this); |
| + ownership_checker_->CheckCurrentUserIsOwner(); |
| +} |
| + |
| std::string DevicePolicyIdentityStrategy::GetDeviceToken() { |
| return device_token_; |
| } |
| std::string DevicePolicyIdentityStrategy::GetDeviceID() { |
| + return device_id_; |
| +} |
| + |
| +std::string DevicePolicyIdentityStrategy::GetMachineID() { |
| return machine_id_; |
| } |
| +em::DeviceRegisterRequest_Type |
| +DevicePolicyIdentityStrategy::GetPolicyRegisterType() { |
| + return em::DeviceRegisterRequest::DEVICE; |
| +} |
| + |
| +std::string DevicePolicyIdentityStrategy::GetPolicyType() { |
| + return kChromeDevicePolicyType; |
| +} |
| + |
| bool DevicePolicyIdentityStrategy::GetCredentials(std::string* username, |
| std::string* auth_token) { |
| // Only register if requested. |
| @@ -55,7 +160,7 @@ bool DevicePolicyIdentityStrategy::GetCredentials(std::string* username, |
| // Only fetch credentials (and, subsequently, token/policy) when the owner |
| // is logged in. |
| - if (!chromeos::OwnershipService::GetSharedInstance()->CurrentUserIsOwner()) |
| + if (!current_user_is_owner_) |
| return false; |
| // We need to know about the profile of the logged in user. |
| @@ -86,8 +191,10 @@ void DevicePolicyIdentityStrategy::OnDeviceTokenAvailable( |
| void DevicePolicyIdentityStrategy::CheckAndTriggerFetch() { |
| std::string username; |
| std::string auth_token; |
| - if (GetCredentials(&username, &auth_token)) |
| + if (GetCredentials(&username, &auth_token)) { |
| + device_id_ = guid::GenerateGUID(); |
| NotifyAuthChanged(); |
| + } |
| } |
| void DevicePolicyIdentityStrategy::Observe(NotificationType type, |
| @@ -100,10 +207,10 @@ void DevicePolicyIdentityStrategy::Observe(NotificationType type, |
| CheckAndTriggerFetch(); |
| } else if (type == NotificationType::LOGIN_USER_CHANGED) { |
| should_register_ = false; |
| - CheckAndTriggerFetch(); |
| + CheckOwnershipAndTriggerFetch(); |
| } else if (type == NotificationType::OWNERSHIP_TAKEN) { |
| should_register_ = true; |
| - CheckAndTriggerFetch(); |
| + CheckOwnershipAndTriggerFetch(); |
| } else if (type == NotificationType::OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED) { |
| CheckAndTriggerFetch(); |
| } else { |