Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/policy/device_token_fetcher.h" | 5 #include "chrome/browser/policy/device_token_fetcher.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/singleton.h" | 9 #include "base/singleton.h" |
| 10 #include "chrome/browser/guid.h" | 10 #include "chrome/browser/guid.h" |
| 11 #include "chrome/browser/net/gaia/token_service.h" | 11 #include "chrome/browser/net/gaia/token_service.h" |
| 12 #include "chrome/browser/policy/proto/device_management_local.pb.h" | |
| 12 #include "chrome/common/chrome_paths.h" | 13 #include "chrome/common/chrome_paths.h" |
| 13 #include "chrome/common/net/gaia/gaia_constants.h" | 14 #include "chrome/common/net/gaia/gaia_constants.h" |
| 14 #include "chrome/common/notification_details.h" | 15 #include "chrome/common/notification_details.h" |
| 15 #include "chrome/common/notification_service.h" | 16 #include "chrome/common/notification_service.h" |
| 16 #include "chrome/common/notification_source.h" | 17 #include "chrome/common/notification_source.h" |
| 17 #include "chrome/common/notification_type.h" | 18 #include "chrome/common/notification_type.h" |
| 18 | 19 |
| 19 namespace policy { | 20 namespace policy { |
| 20 | 21 |
| 22 namespace em = enterprise_management; | |
| 23 | |
| 21 DeviceTokenFetcher::DeviceTokenFetcher( | 24 DeviceTokenFetcher::DeviceTokenFetcher( |
| 22 DeviceManagementBackend* backend, | 25 DeviceManagementBackend* backend, |
| 23 const FilePath& token_path) | 26 const FilePath& token_path) |
| 24 : token_path_(token_path), | 27 : token_path_(token_path), |
| 25 backend_(backend), | 28 backend_(backend), |
| 26 state_(kStateNotStarted), | 29 state_(kStateNotStarted), |
| 27 device_token_load_complete_event_(true, false) { | 30 device_token_load_complete_event_(true, false) { |
| 28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 31 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 29 // The token fetcher gets initialized AuthTokens for the device management | 32 // The token fetcher gets initialized AuthTokens for the device management |
| 30 // server are available. Install a notification observer to ensure that the | 33 // server are available. Install a notification observer to ensure that the |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 57 const em::DeviceRegisterResponse& response) { | 60 const em::DeviceRegisterResponse& response) { |
| 58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 59 DCHECK_EQ(kStateRequestingDeviceTokenFromServer, state_); | 62 DCHECK_EQ(kStateRequestingDeviceTokenFromServer, state_); |
| 60 if (response.has_device_management_token()) { | 63 if (response.has_device_management_token()) { |
| 61 device_token_ = response.device_management_token(); | 64 device_token_ = response.device_management_token(); |
| 62 BrowserThread::PostTask( | 65 BrowserThread::PostTask( |
| 63 BrowserThread::FILE, | 66 BrowserThread::FILE, |
| 64 FROM_HERE, | 67 FROM_HERE, |
| 65 NewRunnableFunction(&WriteDeviceTokenToDisk, | 68 NewRunnableFunction(&WriteDeviceTokenToDisk, |
| 66 token_path_, | 69 token_path_, |
| 67 device_token_)); | 70 device_token_, |
| 71 device_id_)); | |
| 68 SetState(kStateHasDeviceToken); | 72 SetState(kStateHasDeviceToken); |
| 69 } else { | 73 } else { |
| 70 NOTREACHED(); | 74 NOTREACHED(); |
| 71 SetState(kStateFailure); | 75 SetState(kStateFailure); |
| 72 } | 76 } |
| 73 } | 77 } |
| 74 | 78 |
| 75 void DeviceTokenFetcher::OnError(DeviceManagementBackend::ErrorCode code) { | 79 void DeviceTokenFetcher::OnError(DeviceManagementBackend::ErrorCode code) { |
| 76 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 77 SetState(kStateFailure); | 81 SetState(kStateFailure); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 88 FROM_HERE, | 92 FROM_HERE, |
| 89 NewRunnableMethod(this, | 93 NewRunnableMethod(this, |
| 90 &DeviceTokenFetcher::AttemptTokenLoadFromDisk)); | 94 &DeviceTokenFetcher::AttemptTokenLoadFromDisk)); |
| 91 } | 95 } |
| 92 } | 96 } |
| 93 | 97 |
| 94 void DeviceTokenFetcher::AttemptTokenLoadFromDisk() { | 98 void DeviceTokenFetcher::AttemptTokenLoadFromDisk() { |
| 95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 96 FetcherState new_state = kStateFailure; | 100 FetcherState new_state = kStateFailure; |
| 97 if (file_util::PathExists(token_path_)) { | 101 if (file_util::PathExists(token_path_)) { |
| 98 std::string device_token; | 102 std::string data; |
| 99 if (file_util::ReadFileToString(token_path_, &device_token_)) { | 103 em::DeviceToken stored_device_token; |
| 104 if (file_util::ReadFileToString(token_path_, &data) && | |
| 105 stored_device_token.ParseFromArray(data.c_str(), data.size())) { | |
| 106 device_token_ = stored_device_token.device_token(); | |
| 107 device_id_ = stored_device_token.device_id(); | |
| 100 new_state = kStateHasDeviceToken; | 108 new_state = kStateHasDeviceToken; |
| 101 } | 109 } |
| 102 BrowserThread::PostTask( | 110 BrowserThread::PostTask( |
| 103 BrowserThread::UI, | 111 BrowserThread::UI, |
| 104 FROM_HERE, | 112 FROM_HERE, |
| 105 NewRunnableMethod(this, | 113 NewRunnableMethod(this, |
| 106 &DeviceTokenFetcher::SetState, | 114 &DeviceTokenFetcher::SetState, |
| 107 new_state)); | 115 new_state)); |
| 108 return; | 116 return; |
| 109 } | 117 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 121 SendServerRequestIfPossible(); | 129 SendServerRequestIfPossible(); |
| 122 } | 130 } |
| 123 | 131 |
| 124 void DeviceTokenFetcher::SendServerRequestIfPossible() { | 132 void DeviceTokenFetcher::SendServerRequestIfPossible() { |
| 125 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 126 if (state_ == kStateReadyToRequestDeviceTokenFromServer | 134 if (state_ == kStateReadyToRequestDeviceTokenFromServer |
| 127 && HasAuthToken()) { | 135 && HasAuthToken()) { |
| 128 em::DeviceRegisterRequest register_request; | 136 em::DeviceRegisterRequest register_request; |
| 129 SetState(kStateRequestingDeviceTokenFromServer); | 137 SetState(kStateRequestingDeviceTokenFromServer); |
| 130 backend_->ProcessRegisterRequest(auth_token_, | 138 backend_->ProcessRegisterRequest(auth_token_, |
| 131 GenerateNewDeviceID(), | 139 GetDeviceID(), |
| 132 register_request, | 140 register_request, |
| 133 this); | 141 this); |
| 134 } | 142 } |
| 135 } | 143 } |
| 136 | 144 |
| 137 bool DeviceTokenFetcher::IsTokenPending() { | 145 bool DeviceTokenFetcher::IsTokenPending() { |
| 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 139 return !device_token_load_complete_event_.IsSignaled(); | 147 return !device_token_load_complete_event_.IsSignaled(); |
| 140 } | 148 } |
| 141 | 149 |
| 142 std::string DeviceTokenFetcher::GetDeviceToken() { | 150 std::string DeviceTokenFetcher::GetDeviceToken() { |
| 143 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 151 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 144 device_token_load_complete_event_.Wait(); | 152 device_token_load_complete_event_.Wait(); |
| 145 return device_token_; | 153 return device_token_; |
| 146 } | 154 } |
| 147 | 155 |
| 156 std::string DeviceTokenFetcher::GetDeviceID() { | |
| 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 158 // As long as access to this is only allowed from the UI thread, no explicit | |
| 159 // locking is necessary to prevent the ID from being generated twice. | |
| 160 if (device_id_.empty()) { | |
| 161 device_id_ = GenerateNewDeviceID(); | |
| 162 } | |
|
Mattias Nissler (ping if slow)
2010/11/15 18:02:51
no curlies needed here.
Jakob Kummerow (corp)
2010/11/16 09:37:02
Alright, alright, I give up.
Done.
Mattias Nissler (ping if slow)
2010/11/16 09:58:14
:)
| |
| 163 return device_id_; | |
| 164 } | |
| 165 | |
| 148 void DeviceTokenFetcher::SetState(FetcherState state) { | 166 void DeviceTokenFetcher::SetState(FetcherState state) { |
| 149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 150 if (state_ == state) | 168 if (state_ == state) { |
| 151 return; | 169 return; |
| 170 } | |
|
Mattias Nissler (ping if slow)
2010/11/15 18:02:51
Same here? Or do you have a reason for changing th
Jakob Kummerow (corp)
2010/11/16 09:37:02
Done.
| |
| 152 state_ = state; | 171 state_ = state; |
| 153 if (state == kStateFailure) { | 172 if (state == kStateFailure) { |
| 154 device_token_load_complete_event_.Signal(); | 173 device_token_load_complete_event_.Signal(); |
| 155 } else if (state == kStateHasDeviceToken) { | 174 } else if (state == kStateHasDeviceToken) { |
| 156 device_token_load_complete_event_.Signal(); | 175 device_token_load_complete_event_.Signal(); |
| 157 NotificationService::current()->Notify( | 176 NotificationService::current()->Notify( |
| 158 NotificationType::DEVICE_TOKEN_AVAILABLE, | 177 NotificationType::DEVICE_TOKEN_AVAILABLE, |
| 159 Source<DeviceTokenFetcher>(this), | 178 Source<DeviceTokenFetcher>(this), |
| 160 NotificationService::NoDetails()); | 179 NotificationService::NoDetails()); |
| 161 } | 180 } |
| 162 } | 181 } |
| 163 | 182 |
| 164 void DeviceTokenFetcher::GetDeviceTokenPath(FilePath* token_path) const { | 183 void DeviceTokenFetcher::GetDeviceTokenPath(FilePath* token_path) const { |
| 165 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 166 *token_path = token_path_; | 185 *token_path = token_path_; |
| 167 } | 186 } |
| 168 | 187 |
| 169 bool DeviceTokenFetcher::IsTokenValid() const { | 188 bool DeviceTokenFetcher::IsTokenValid() const { |
| 170 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 189 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 171 return state_ == kStateHasDeviceToken; | 190 return state_ == kStateHasDeviceToken; |
| 172 } | 191 } |
| 173 | 192 |
| 174 // static | 193 // static |
| 175 void DeviceTokenFetcher::WriteDeviceTokenToDisk( | 194 void DeviceTokenFetcher::WriteDeviceTokenToDisk( |
| 176 const FilePath& path, | 195 const FilePath& path, |
| 177 const std::string& device_token) { | 196 const std::string& device_token, |
| 197 const std::string& device_id) { | |
| 198 em::DeviceToken storable_device_token; | |
| 199 storable_device_token.set_device_token(device_token); | |
| 200 storable_device_token.set_device_id(device_id); | |
| 201 std::string data; | |
| 202 storable_device_token.SerializeToString(&data); | |
|
Mattias Nissler (ping if slow)
2010/11/15 18:02:51
Should probably put a DCHECK() for the SerializeTo
Jakob Kummerow (corp)
2010/11/16 09:37:02
Done.
| |
| 178 file_util::WriteFile(path, | 203 file_util::WriteFile(path, |
| 179 device_token.c_str(), | 204 data.c_str(), |
| 180 device_token.length()); | 205 data.length()); |
|
Mattias Nissler (ping if slow)
2010/11/15 18:02:51
Hm, doesn't this fit on line 203?
Jakob Kummerow (corp)
2010/11/16 09:37:02
Done.
| |
| 181 } | 206 } |
| 182 | 207 |
| 183 // static | 208 // static |
| 184 std::string DeviceTokenFetcher::GenerateNewDeviceID() { | 209 std::string DeviceTokenFetcher::GenerateNewDeviceID() { |
| 185 return guid::GenerateGUID(); | 210 return guid::GenerateGUID(); |
| 186 } | 211 } |
| 187 | 212 |
| 188 } | 213 } |
| OLD | NEW |