| 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_management_backend_impl.h" | 5 #include "chrome/browser/policy/device_management_backend_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| 11 #include "net/base/escape.h" | 11 #include "net/base/escape.h" |
| 12 #include "net/url_request/url_request_status.h" | 12 #include "net/url_request/url_request_status.h" |
| 13 #include "chrome/browser/policy/device_management_service.h" | 13 #include "chrome/browser/policy/device_management_service.h" |
| 14 #include "chrome/common/chrome_version_info.h" | 14 #include "chrome/common/chrome_version_info.h" |
| 15 | 15 |
| 16 namespace policy { | 16 namespace policy { |
| 17 | 17 |
| 18 // Name constants for URL query parameters. |
| 19 const char DeviceManagementBackendImpl::kParamRequest[] = "request"; |
| 20 const char DeviceManagementBackendImpl::kParamDeviceType[] = "devicetype"; |
| 21 const char DeviceManagementBackendImpl::kParamAppType[] = "apptype"; |
| 22 const char DeviceManagementBackendImpl::kParamDeviceID[] = "deviceid"; |
| 23 const char DeviceManagementBackendImpl::kParamAgent[] = "agent"; |
| 24 |
| 25 // String constants for the device and app type we report to the server. |
| 26 const char DeviceManagementBackendImpl::kValueRequestRegister[] = "register"; |
| 27 const char DeviceManagementBackendImpl::kValueRequestUnregister[] = |
| 28 "unregister"; |
| 29 const char DeviceManagementBackendImpl::kValueRequestPolicy[] = "policy"; |
| 30 const char DeviceManagementBackendImpl::kValueDeviceType[] = "Chrome OS"; |
| 31 const char DeviceManagementBackendImpl::kValueAppType[] = "Chrome"; |
| 32 |
| 18 namespace { | 33 namespace { |
| 19 | 34 |
| 20 // Name constants for URL query parameters. | 35 const char kValueAgent[] = "%s enterprise management client version %s (%s)"; |
| 21 const char kServiceParamRequest[] = "request"; | |
| 22 const char kServiceParamDeviceType[] = "devicetype"; | |
| 23 const char kServiceParamAppType[] = "apptype"; | |
| 24 const char kServiceParamDeviceID[] = "deviceid"; | |
| 25 const char kServiceParamAgent[] = "agent"; | |
| 26 | 36 |
| 27 // String constants for the device and app type we report to the server. | 37 const char kPostContentType[] = "application/octet-stream"; |
| 28 const char kServiceValueDeviceType[] = "Chrome OS"; | |
| 29 const char kServiceValueAppType[] = "Chrome"; | |
| 30 | |
| 31 const char kServiceValueAgent[] = | |
| 32 "%s enterprise management client version %s (%s)"; | |
| 33 | 38 |
| 34 const char kServiceTokenAuthHeader[] = "Authorization: GoogleLogin auth="; | 39 const char kServiceTokenAuthHeader[] = "Authorization: GoogleLogin auth="; |
| 35 const char kDMTokenAuthHeader[] = "Authorization: GoogleDMToken token="; | 40 const char kDMTokenAuthHeader[] = "Authorization: GoogleDMToken token="; |
| 36 | 41 |
| 37 // Helper class for URL query parameter encoding/decoding. | 42 // Helper class for URL query parameter encoding/decoding. |
| 38 class URLQueryParameters { | 43 class URLQueryParameters { |
| 39 public: | 44 public: |
| 40 URLQueryParameters() {} | 45 URLQueryParameters() {} |
| 41 | 46 |
| 42 // Add a query parameter. | 47 // Add a query parameter. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 virtual void HandleResponse(const URLRequestStatus& status, | 93 virtual void HandleResponse(const URLRequestStatus& status, |
| 89 int response_code, | 94 int response_code, |
| 90 const ResponseCookies& cookies, | 95 const ResponseCookies& cookies, |
| 91 const std::string& data); | 96 const std::string& data); |
| 92 virtual GURL GetURL(const std::string& server_url); | 97 virtual GURL GetURL(const std::string& server_url); |
| 93 virtual void ConfigureRequest(URLFetcher* fetcher); | 98 virtual void ConfigureRequest(URLFetcher* fetcher); |
| 94 | 99 |
| 95 protected: | 100 protected: |
| 96 // Constructs a device management job running for the given backend. | 101 // Constructs a device management job running for the given backend. |
| 97 DeviceManagementJobBase(DeviceManagementBackendImpl* backend_impl, | 102 DeviceManagementJobBase(DeviceManagementBackendImpl* backend_impl, |
| 98 const std::string& request_type) | 103 const std::string& request_type, |
| 104 const std::string& device_id) |
| 99 : backend_impl_(backend_impl) { | 105 : backend_impl_(backend_impl) { |
| 100 query_params_.Put(kServiceParamRequest, request_type); | 106 query_params_.Put(DeviceManagementBackendImpl::kParamRequest, request_type); |
| 101 query_params_.Put(kServiceParamDeviceType, kServiceValueDeviceType); | 107 query_params_.Put(DeviceManagementBackendImpl::kParamDeviceType, |
| 102 query_params_.Put(kServiceParamAppType, kServiceValueAppType); | 108 DeviceManagementBackendImpl::kValueDeviceType); |
| 103 chrome::VersionInfo version_info; | 109 query_params_.Put(DeviceManagementBackendImpl::kParamAppType, |
| 104 std::string agent = base::StringPrintf(kServiceValueAgent, | 110 DeviceManagementBackendImpl::kValueAppType); |
| 105 version_info.Name().c_str(), | 111 query_params_.Put(DeviceManagementBackendImpl::kParamDeviceID, device_id); |
| 106 version_info.Version().c_str(), | 112 query_params_.Put(DeviceManagementBackendImpl::kParamAgent, |
| 107 version_info.LastChange().c_str()); | 113 DeviceManagementBackendImpl::GetAgentString()); |
| 108 query_params_.Put(kServiceParamAgent, agent); | |
| 109 } | 114 } |
| 110 | 115 |
| 111 void SetQueryParam(const std::string& name, const std::string& value) { | 116 void SetQueryParam(const std::string& name, const std::string& value) { |
| 112 query_params_.Put(name, value); | 117 query_params_.Put(name, value); |
| 113 } | 118 } |
| 114 | 119 |
| 115 void SetAuthToken(const std::string& auth_token) { | 120 void SetAuthToken(const std::string& auth_token) { |
| 116 auth_token_ = auth_token; | 121 auth_token_ = auth_token; |
| 117 } | 122 } |
| 118 | 123 |
| 119 void SetDeviceManagementToken(const std::string& device_management_token) { | 124 void SetDeviceManagementToken(const std::string& device_management_token) { |
| 120 device_management_token_ = device_management_token; | 125 device_management_token_ = device_management_token; |
| 121 } | 126 } |
| 122 | 127 |
| 123 void SetDeviceID(const std::string& device_id) { | |
| 124 query_params_.Put(kServiceParamDeviceID, device_id); | |
| 125 } | |
| 126 | |
| 127 void SetPayload(const em::DeviceManagementRequest& request) { | 128 void SetPayload(const em::DeviceManagementRequest& request) { |
| 128 if (!request.SerializeToString(&payload_)) { | 129 if (!request.SerializeToString(&payload_)) { |
| 129 NOTREACHED(); | 130 NOTREACHED(); |
| 130 LOG(ERROR) << "Failed to serialize request."; | 131 LOG(ERROR) << "Failed to serialize request."; |
| 131 } | 132 } |
| 132 } | 133 } |
| 133 | 134 |
| 134 private: | 135 private: |
| 135 // Implemented by subclasses to handle decoded responses and errors. | 136 // Implemented by subclasses to handle decoded responses and errors. |
| 136 virtual void OnResponse( | 137 virtual void OnResponse( |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 | 204 |
| 204 OnResponse(response); | 205 OnResponse(response); |
| 205 } | 206 } |
| 206 | 207 |
| 207 GURL DeviceManagementJobBase::GetURL( | 208 GURL DeviceManagementJobBase::GetURL( |
| 208 const std::string& server_url) { | 209 const std::string& server_url) { |
| 209 return GURL(server_url + '?' + query_params_.Encode()); | 210 return GURL(server_url + '?' + query_params_.Encode()); |
| 210 } | 211 } |
| 211 | 212 |
| 212 void DeviceManagementJobBase::ConfigureRequest(URLFetcher* fetcher) { | 213 void DeviceManagementJobBase::ConfigureRequest(URLFetcher* fetcher) { |
| 213 fetcher->set_upload_data("application/octet-stream", payload_); | 214 fetcher->set_upload_data(kPostContentType, payload_); |
| 214 std::string extra_headers; | 215 std::string extra_headers; |
| 215 if (!auth_token_.empty()) | 216 if (!auth_token_.empty()) |
| 216 extra_headers += kServiceTokenAuthHeader + auth_token_ + "\n"; | 217 extra_headers += kServiceTokenAuthHeader + auth_token_ + "\n"; |
| 217 if (!device_management_token_.empty()) | 218 if (!device_management_token_.empty()) |
| 218 extra_headers += kDMTokenAuthHeader + device_management_token_ + "\n"; | 219 extra_headers += kDMTokenAuthHeader + device_management_token_ + "\n"; |
| 219 fetcher->set_extra_request_headers(extra_headers); | 220 fetcher->set_extra_request_headers(extra_headers); |
| 220 } | 221 } |
| 221 | 222 |
| 222 // Handles device registration jobs. | 223 // Handles device registration jobs. |
| 223 class DeviceManagementRegisterJob : public DeviceManagementJobBase { | 224 class DeviceManagementRegisterJob : public DeviceManagementJobBase { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 243 | 244 |
| 244 DISALLOW_COPY_AND_ASSIGN(DeviceManagementRegisterJob); | 245 DISALLOW_COPY_AND_ASSIGN(DeviceManagementRegisterJob); |
| 245 }; | 246 }; |
| 246 | 247 |
| 247 DeviceManagementRegisterJob::DeviceManagementRegisterJob( | 248 DeviceManagementRegisterJob::DeviceManagementRegisterJob( |
| 248 DeviceManagementBackendImpl* backend_impl, | 249 DeviceManagementBackendImpl* backend_impl, |
| 249 const std::string& auth_token, | 250 const std::string& auth_token, |
| 250 const std::string& device_id, | 251 const std::string& device_id, |
| 251 const em::DeviceRegisterRequest& request, | 252 const em::DeviceRegisterRequest& request, |
| 252 DeviceManagementBackend::DeviceRegisterResponseDelegate* delegate) | 253 DeviceManagementBackend::DeviceRegisterResponseDelegate* delegate) |
| 253 : DeviceManagementJobBase(backend_impl, "register"), | 254 : DeviceManagementJobBase( |
| 255 backend_impl, |
| 256 DeviceManagementBackendImpl::kValueRequestRegister, |
| 257 device_id), |
| 254 delegate_(delegate) { | 258 delegate_(delegate) { |
| 255 SetDeviceID(device_id); | |
| 256 SetAuthToken(auth_token); | 259 SetAuthToken(auth_token); |
| 257 em::DeviceManagementRequest request_wrapper; | 260 em::DeviceManagementRequest request_wrapper; |
| 258 request_wrapper.mutable_register_request()->CopyFrom(request); | 261 request_wrapper.mutable_register_request()->CopyFrom(request); |
| 259 SetPayload(request_wrapper); | 262 SetPayload(request_wrapper); |
| 260 } | 263 } |
| 261 | 264 |
| 262 // Handles device unregistration jobs. | 265 // Handles device unregistration jobs. |
| 263 class DeviceManagementUnregisterJob : public DeviceManagementJobBase { | 266 class DeviceManagementUnregisterJob : public DeviceManagementJobBase { |
| 264 public: | 267 public: |
| 265 DeviceManagementUnregisterJob( | 268 DeviceManagementUnregisterJob( |
| 266 DeviceManagementBackendImpl* backend_impl, | 269 DeviceManagementBackendImpl* backend_impl, |
| 270 const std::string& device_id, |
| 267 const std::string& device_management_token, | 271 const std::string& device_management_token, |
| 268 const em::DeviceUnregisterRequest& request, | 272 const em::DeviceUnregisterRequest& request, |
| 269 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate); | 273 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate); |
| 270 virtual ~DeviceManagementUnregisterJob() {} | 274 virtual ~DeviceManagementUnregisterJob() {} |
| 271 | 275 |
| 272 private: | 276 private: |
| 273 // DeviceManagementJobBase overrides. | 277 // DeviceManagementJobBase overrides. |
| 274 virtual void OnError(DeviceManagementBackend::ErrorCode error) { | 278 virtual void OnError(DeviceManagementBackend::ErrorCode error) { |
| 275 delegate_->OnError(error); | 279 delegate_->OnError(error); |
| 276 } | 280 } |
| 277 virtual void OnResponse(const em::DeviceManagementResponse& response) { | 281 virtual void OnResponse(const em::DeviceManagementResponse& response) { |
| 278 delegate_->HandleUnregisterResponse(response.unregister_response()); | 282 delegate_->HandleUnregisterResponse(response.unregister_response()); |
| 279 } | 283 } |
| 280 | 284 |
| 281 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate_; | 285 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate_; |
| 282 | 286 |
| 283 DISALLOW_COPY_AND_ASSIGN(DeviceManagementUnregisterJob); | 287 DISALLOW_COPY_AND_ASSIGN(DeviceManagementUnregisterJob); |
| 284 }; | 288 }; |
| 285 | 289 |
| 286 DeviceManagementUnregisterJob::DeviceManagementUnregisterJob( | 290 DeviceManagementUnregisterJob::DeviceManagementUnregisterJob( |
| 287 DeviceManagementBackendImpl* backend_impl, | 291 DeviceManagementBackendImpl* backend_impl, |
| 288 const std::string& device_management_token, | 292 const std::string& device_management_token, |
| 293 const std::string& device_id, |
| 289 const em::DeviceUnregisterRequest& request, | 294 const em::DeviceUnregisterRequest& request, |
| 290 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate) | 295 DeviceManagementBackend::DeviceUnregisterResponseDelegate* delegate) |
| 291 : DeviceManagementJobBase(backend_impl, "unregister"), | 296 : DeviceManagementJobBase( |
| 297 backend_impl, |
| 298 DeviceManagementBackendImpl::kValueRequestUnregister, |
| 299 device_id), |
| 292 delegate_(delegate) { | 300 delegate_(delegate) { |
| 293 SetDeviceManagementToken(device_management_token); | 301 SetDeviceManagementToken(device_management_token); |
| 294 em::DeviceManagementRequest request_wrapper; | 302 em::DeviceManagementRequest request_wrapper; |
| 295 request_wrapper.mutable_unregister_request()->CopyFrom(request); | 303 request_wrapper.mutable_unregister_request()->CopyFrom(request); |
| 296 SetPayload(request_wrapper); | 304 SetPayload(request_wrapper); |
| 297 } | 305 } |
| 298 | 306 |
| 299 // Handles policy request jobs. | 307 // Handles policy request jobs. |
| 300 class DeviceManagementPolicyJob : public DeviceManagementJobBase { | 308 class DeviceManagementPolicyJob : public DeviceManagementJobBase { |
| 301 public: | 309 public: |
| 302 DeviceManagementPolicyJob( | 310 DeviceManagementPolicyJob( |
| 303 DeviceManagementBackendImpl* backend_impl, | 311 DeviceManagementBackendImpl* backend_impl, |
| 304 const std::string& device_management_token, | 312 const std::string& device_management_token, |
| 313 const std::string& device_id, |
| 305 const em::DevicePolicyRequest& request, | 314 const em::DevicePolicyRequest& request, |
| 306 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate); | 315 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate); |
| 307 virtual ~DeviceManagementPolicyJob() {} | 316 virtual ~DeviceManagementPolicyJob() {} |
| 308 | 317 |
| 309 private: | 318 private: |
| 310 // DeviceManagementJobBase overrides. | 319 // DeviceManagementJobBase overrides. |
| 311 virtual void OnError(DeviceManagementBackend::ErrorCode error) { | 320 virtual void OnError(DeviceManagementBackend::ErrorCode error) { |
| 312 delegate_->OnError(error); | 321 delegate_->OnError(error); |
| 313 } | 322 } |
| 314 virtual void OnResponse(const em::DeviceManagementResponse& response) { | 323 virtual void OnResponse(const em::DeviceManagementResponse& response) { |
| 315 delegate_->HandlePolicyResponse(response.policy_response()); | 324 delegate_->HandlePolicyResponse(response.policy_response()); |
| 316 } | 325 } |
| 317 | 326 |
| 318 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate_; | 327 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate_; |
| 319 | 328 |
| 320 DISALLOW_COPY_AND_ASSIGN(DeviceManagementPolicyJob); | 329 DISALLOW_COPY_AND_ASSIGN(DeviceManagementPolicyJob); |
| 321 }; | 330 }; |
| 322 | 331 |
| 323 DeviceManagementPolicyJob::DeviceManagementPolicyJob( | 332 DeviceManagementPolicyJob::DeviceManagementPolicyJob( |
| 324 DeviceManagementBackendImpl* backend_impl, | 333 DeviceManagementBackendImpl* backend_impl, |
| 325 const std::string& device_management_token, | 334 const std::string& device_management_token, |
| 335 const std::string& device_id, |
| 326 const em::DevicePolicyRequest& request, | 336 const em::DevicePolicyRequest& request, |
| 327 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate) | 337 DeviceManagementBackend::DevicePolicyResponseDelegate* delegate) |
| 328 : DeviceManagementJobBase(backend_impl, "policy"), | 338 : DeviceManagementJobBase( |
| 339 backend_impl, |
| 340 DeviceManagementBackendImpl::kValueRequestPolicy, |
| 341 device_id), |
| 329 delegate_(delegate) { | 342 delegate_(delegate) { |
| 330 SetDeviceManagementToken(device_management_token); | 343 SetDeviceManagementToken(device_management_token); |
| 331 em::DeviceManagementRequest request_wrapper; | 344 em::DeviceManagementRequest request_wrapper; |
| 332 request_wrapper.mutable_policy_request()->CopyFrom(request); | 345 request_wrapper.mutable_policy_request()->CopyFrom(request); |
| 333 SetPayload(request_wrapper); | 346 SetPayload(request_wrapper); |
| 334 } | 347 } |
| 335 | 348 |
| 336 DeviceManagementBackendImpl::DeviceManagementBackendImpl( | 349 DeviceManagementBackendImpl::DeviceManagementBackendImpl( |
| 337 DeviceManagementService* service) | 350 DeviceManagementService* service) |
| 338 : service_(service) { | 351 : service_(service) { |
| 339 } | 352 } |
| 340 | 353 |
| 341 DeviceManagementBackendImpl::~DeviceManagementBackendImpl() { | 354 DeviceManagementBackendImpl::~DeviceManagementBackendImpl() { |
| 342 // Swap to a helper, so we don't interfere with the unregistration on delete. | 355 // Swap to a helper, so we don't interfere with the unregistration on delete. |
| 343 JobSet to_be_deleted; | 356 JobSet to_be_deleted; |
| 344 to_be_deleted.swap(pending_jobs_); | 357 to_be_deleted.swap(pending_jobs_); |
| 345 for (JobSet::iterator job(to_be_deleted.begin()); | 358 for (JobSet::iterator job(to_be_deleted.begin()); |
| 346 job != to_be_deleted.end(); | 359 job != to_be_deleted.end(); |
| 347 ++job) { | 360 ++job) { |
| 348 service_->RemoveJob(*job); | 361 service_->RemoveJob(*job); |
| 349 delete *job; | 362 delete *job; |
| 350 } | 363 } |
| 351 } | 364 } |
| 352 | 365 |
| 366 std::string DeviceManagementBackendImpl::GetAgentString() { |
| 367 chrome::VersionInfo version_info; |
| 368 return base::StringPrintf(kValueAgent, |
| 369 version_info.Name().c_str(), |
| 370 version_info.Version().c_str(), |
| 371 version_info.LastChange().c_str()); |
| 372 } |
| 373 |
| 353 void DeviceManagementBackendImpl::JobDone(DeviceManagementJobBase* job) { | 374 void DeviceManagementBackendImpl::JobDone(DeviceManagementJobBase* job) { |
| 354 pending_jobs_.erase(job); | 375 pending_jobs_.erase(job); |
| 355 } | 376 } |
| 356 | 377 |
| 357 void DeviceManagementBackendImpl::AddJob(DeviceManagementJobBase* job) { | 378 void DeviceManagementBackendImpl::AddJob(DeviceManagementJobBase* job) { |
| 358 pending_jobs_.insert(job); | 379 pending_jobs_.insert(job); |
| 359 service_->AddJob(job); | 380 service_->AddJob(job); |
| 360 } | 381 } |
| 361 | 382 |
| 362 void DeviceManagementBackendImpl::ProcessRegisterRequest( | 383 void DeviceManagementBackendImpl::ProcessRegisterRequest( |
| 363 const std::string& auth_token, | 384 const std::string& auth_token, |
| 364 const std::string& device_id, | 385 const std::string& device_id, |
| 365 const em::DeviceRegisterRequest& request, | 386 const em::DeviceRegisterRequest& request, |
| 366 DeviceRegisterResponseDelegate* delegate) { | 387 DeviceRegisterResponseDelegate* delegate) { |
| 367 AddJob(new DeviceManagementRegisterJob(this, auth_token, device_id, request, | 388 AddJob(new DeviceManagementRegisterJob(this, auth_token, device_id, request, |
| 368 delegate)); | 389 delegate)); |
| 369 } | 390 } |
| 370 | 391 |
| 371 void DeviceManagementBackendImpl::ProcessUnregisterRequest( | 392 void DeviceManagementBackendImpl::ProcessUnregisterRequest( |
| 372 const std::string& device_management_token, | 393 const std::string& device_management_token, |
| 394 const std::string& device_id, |
| 373 const em::DeviceUnregisterRequest& request, | 395 const em::DeviceUnregisterRequest& request, |
| 374 DeviceUnregisterResponseDelegate* delegate) { | 396 DeviceUnregisterResponseDelegate* delegate) { |
| 375 AddJob(new DeviceManagementUnregisterJob(this, device_management_token, | 397 AddJob(new DeviceManagementUnregisterJob(this, device_management_token, |
| 376 request, delegate)); | 398 device_id, request, delegate)); |
| 377 } | 399 } |
| 378 | 400 |
| 379 void DeviceManagementBackendImpl::ProcessPolicyRequest( | 401 void DeviceManagementBackendImpl::ProcessPolicyRequest( |
| 380 const std::string& device_management_token, | 402 const std::string& device_management_token, |
| 403 const std::string& device_id, |
| 381 const em::DevicePolicyRequest& request, | 404 const em::DevicePolicyRequest& request, |
| 382 DevicePolicyResponseDelegate* delegate) { | 405 DevicePolicyResponseDelegate* delegate) { |
| 383 AddJob(new DeviceManagementPolicyJob(this, device_management_token, request, | 406 AddJob(new DeviceManagementPolicyJob(this, device_management_token, device_id, |
| 384 delegate)); | 407 request, delegate)); |
| 385 } | 408 } |
| 386 | 409 |
| 387 } // namespace policy | 410 } // namespace policy |
| OLD | NEW |