OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "remoting/host/setup/daemon_controller_delegate_win.h" | 5 #include "remoting/host/setup/daemon_controller_delegate_win.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" |
15 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
16 #include "base/values.h" | 17 #include "base/values.h" |
17 #include "base/win/scoped_bstr.h" | 18 #include "base/win/scoped_bstr.h" |
18 #include "base/win/windows_version.h" | 19 #include "base/win/windows_version.h" |
19 #include "remoting/base/scoped_sc_handle_win.h" | 20 #include "remoting/base/scoped_sc_handle_win.h" |
20 #include "remoting/host/branding.h" | 21 #include "remoting/host/branding.h" |
21 #include "remoting/host/host_config.h" | 22 #include "remoting/host/host_config.h" |
22 #include "remoting/host/usage_stats_consent.h" | 23 #include "remoting/host/usage_stats_consent.h" |
23 #include "remoting/host/win/security_descriptor.h" | 24 #include "remoting/host/win/security_descriptor.h" |
24 | 25 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 kHostIdConfigPath, kHostOwnerConfigPath, kHostOwnerEmailConfigPath, | 60 kHostIdConfigPath, kHostOwnerConfigPath, kHostOwnerEmailConfigPath, |
60 kXmppLoginConfigPath }; | 61 kXmppLoginConfigPath }; |
61 | 62 |
62 // The configuration keys whose values may be read by GetConfig(). | 63 // The configuration keys whose values may be read by GetConfig(). |
63 const char* const kUnprivilegedConfigKeys[] = { | 64 const char* const kUnprivilegedConfigKeys[] = { |
64 kHostIdConfigPath, kXmppLoginConfigPath }; | 65 kHostIdConfigPath, kXmppLoginConfigPath }; |
65 | 66 |
66 // Reads and parses the configuration file up to |kMaxConfigFileSize| in | 67 // Reads and parses the configuration file up to |kMaxConfigFileSize| in |
67 // size. | 68 // size. |
68 bool ReadConfig(const base::FilePath& filename, | 69 bool ReadConfig(const base::FilePath& filename, |
69 scoped_ptr<base::DictionaryValue>* config_out) { | 70 std::unique_ptr<base::DictionaryValue>* config_out) { |
70 std::string file_content; | 71 std::string file_content; |
71 if (!base::ReadFileToStringWithMaxSize(filename, &file_content, | 72 if (!base::ReadFileToStringWithMaxSize(filename, &file_content, |
72 kMaxConfigFileSize)) { | 73 kMaxConfigFileSize)) { |
73 PLOG(ERROR) << "Failed to read '" << filename.value() << "'."; | 74 PLOG(ERROR) << "Failed to read '" << filename.value() << "'."; |
74 return false; | 75 return false; |
75 } | 76 } |
76 | 77 |
77 // Parse the JSON configuration, expecting it to contain a dictionary. | 78 // Parse the JSON configuration, expecting it to contain a dictionary. |
78 scoped_ptr<base::Value> value = | 79 std::unique_ptr<base::Value> value = |
79 base::JSONReader::Read(file_content, base::JSON_ALLOW_TRAILING_COMMAS); | 80 base::JSONReader::Read(file_content, base::JSON_ALLOW_TRAILING_COMMAS); |
80 | 81 |
81 base::DictionaryValue* dictionary; | 82 base::DictionaryValue* dictionary; |
82 if (!value || !value->GetAsDictionary(&dictionary)) { | 83 if (!value || !value->GetAsDictionary(&dictionary)) { |
83 LOG(ERROR) << "Failed to parse '" << filename.value() << "'."; | 84 LOG(ERROR) << "Failed to parse '" << filename.value() << "'."; |
84 return false; | 85 return false; |
85 } | 86 } |
86 | 87 |
87 ignore_result(value.release()); | 88 ignore_result(value.release()); |
88 config_out->reset(dictionary); | 89 config_out->reset(dictionary); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 return true; | 153 return true; |
153 } | 154 } |
154 | 155 |
155 // Writes the configuration file up to |kMaxConfigFileSize| in size. | 156 // Writes the configuration file up to |kMaxConfigFileSize| in size. |
156 bool WriteConfig(const std::string& content) { | 157 bool WriteConfig(const std::string& content) { |
157 if (content.length() > kMaxConfigFileSize) { | 158 if (content.length() > kMaxConfigFileSize) { |
158 return false; | 159 return false; |
159 } | 160 } |
160 | 161 |
161 // Extract the configuration data that the user will verify. | 162 // Extract the configuration data that the user will verify. |
162 scoped_ptr<base::Value> config_value = base::JSONReader::Read(content); | 163 std::unique_ptr<base::Value> config_value = base::JSONReader::Read(content); |
163 if (!config_value.get()) { | 164 if (!config_value.get()) { |
164 return false; | 165 return false; |
165 } | 166 } |
166 base::DictionaryValue* config_dict = nullptr; | 167 base::DictionaryValue* config_dict = nullptr; |
167 if (!config_value->GetAsDictionary(&config_dict)) { | 168 if (!config_value->GetAsDictionary(&config_dict)) { |
168 return false; | 169 return false; |
169 } | 170 } |
170 std::string email; | 171 std::string email; |
171 if (!config_dict->GetString(kHostOwnerEmailConfigPath, &email) && | 172 if (!config_dict->GetString(kHostOwnerEmailConfigPath, &email) && |
172 !config_dict->GetString(kHostOwnerConfigPath, &email) && | 173 !config_dict->GetString(kHostOwnerConfigPath, &email) && |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 SERVICE_STATUS status; | 362 SERVICE_STATUS status; |
362 if (!::QueryServiceStatus(service.Get(), &status)) { | 363 if (!::QueryServiceStatus(service.Get(), &status)) { |
363 PLOG(ERROR) << "Failed to query the state of the '" | 364 PLOG(ERROR) << "Failed to query the state of the '" |
364 << kWindowsServiceName << "' service"; | 365 << kWindowsServiceName << "' service"; |
365 return DaemonController::STATE_UNKNOWN; | 366 return DaemonController::STATE_UNKNOWN; |
366 } | 367 } |
367 | 368 |
368 return ConvertToDaemonState(status.dwCurrentState); | 369 return ConvertToDaemonState(status.dwCurrentState); |
369 } | 370 } |
370 | 371 |
371 scoped_ptr<base::DictionaryValue> DaemonControllerDelegateWin::GetConfig() { | 372 std::unique_ptr<base::DictionaryValue> |
| 373 DaemonControllerDelegateWin::GetConfig() { |
372 base::FilePath config_dir = remoting::GetConfigDir(); | 374 base::FilePath config_dir = remoting::GetConfigDir(); |
373 | 375 |
374 // Read the unprivileged part of host configuration. | 376 // Read the unprivileged part of host configuration. |
375 scoped_ptr<base::DictionaryValue> config; | 377 std::unique_ptr<base::DictionaryValue> config; |
376 if (!ReadConfig(config_dir.Append(kUnprivilegedConfigFileName), &config)) | 378 if (!ReadConfig(config_dir.Append(kUnprivilegedConfigFileName), &config)) |
377 return nullptr; | 379 return nullptr; |
378 | 380 |
379 return config; | 381 return config; |
380 } | 382 } |
381 | 383 |
382 void DaemonControllerDelegateWin::UpdateConfig( | 384 void DaemonControllerDelegateWin::UpdateConfig( |
383 scoped_ptr<base::DictionaryValue> config, | 385 std::unique_ptr<base::DictionaryValue> config, |
384 const DaemonController::CompletionCallback& done) { | 386 const DaemonController::CompletionCallback& done) { |
385 // Check for bad keys. | 387 // Check for bad keys. |
386 for (size_t i = 0; i < arraysize(kReadonlyKeys); ++i) { | 388 for (size_t i = 0; i < arraysize(kReadonlyKeys); ++i) { |
387 if (config->HasKey(kReadonlyKeys[i])) { | 389 if (config->HasKey(kReadonlyKeys[i])) { |
388 LOG(ERROR) << "Cannot update config: '" << kReadonlyKeys[i] | 390 LOG(ERROR) << "Cannot update config: '" << kReadonlyKeys[i] |
389 << "' is read only."; | 391 << "' is read only."; |
390 InvokeCompletionCallback(done, false); | 392 InvokeCompletionCallback(done, false); |
391 return; | 393 return; |
392 } | 394 } |
393 } | 395 } |
394 // Get the old config. | 396 // Get the old config. |
395 base::FilePath config_dir = remoting::GetConfigDir(); | 397 base::FilePath config_dir = remoting::GetConfigDir(); |
396 scoped_ptr<base::DictionaryValue> config_old; | 398 std::unique_ptr<base::DictionaryValue> config_old; |
397 if (!ReadConfig(config_dir.Append(kConfigFileName), &config_old)) { | 399 if (!ReadConfig(config_dir.Append(kConfigFileName), &config_old)) { |
398 InvokeCompletionCallback(done, false); | 400 InvokeCompletionCallback(done, false); |
399 return; | 401 return; |
400 } | 402 } |
401 | 403 |
402 // Merge items from the given config into the old config. | 404 // Merge items from the given config into the old config. |
403 config_old->MergeDictionary(config.release()); | 405 config_old->MergeDictionary(config.release()); |
404 | 406 |
405 // Write the updated config. | 407 // Write the updated config. |
406 std::string config_updated_str; | 408 std::string config_updated_str; |
(...skipping 24 matching lines...) Expand all Loading... |
431 // consent to collecting crash dumps. | 433 // consent to collecting crash dumps. |
432 if (remoting::GetUsageStatsConsent(&allowed, &set_by_policy)) { | 434 if (remoting::GetUsageStatsConsent(&allowed, &set_by_policy)) { |
433 consent.allowed = allowed; | 435 consent.allowed = allowed; |
434 consent.set_by_policy = set_by_policy; | 436 consent.set_by_policy = set_by_policy; |
435 } | 437 } |
436 | 438 |
437 return consent; | 439 return consent; |
438 } | 440 } |
439 | 441 |
440 void DaemonControllerDelegateWin::SetConfigAndStart( | 442 void DaemonControllerDelegateWin::SetConfigAndStart( |
441 scoped_ptr<base::DictionaryValue> config, | 443 std::unique_ptr<base::DictionaryValue> config, |
442 bool consent, | 444 bool consent, |
443 const DaemonController::CompletionCallback& done) { | 445 const DaemonController::CompletionCallback& done) { |
444 // Record the user's consent. | 446 // Record the user's consent. |
445 if (!remoting::SetUsageStatsConsent(consent)) { | 447 if (!remoting::SetUsageStatsConsent(consent)) { |
446 InvokeCompletionCallback(done, false); | 448 InvokeCompletionCallback(done, false); |
447 return; | 449 return; |
448 } | 450 } |
449 | 451 |
450 // Set the configuration. | 452 // Set the configuration. |
451 std::string config_str; | 453 std::string config_str; |
(...skipping 11 matching lines...) Expand all Loading... |
463 InvokeCompletionCallback(done, false); | 465 InvokeCompletionCallback(done, false); |
464 return; | 466 return; |
465 } | 467 } |
466 | 468 |
467 // Start daemon. | 469 // Start daemon. |
468 InvokeCompletionCallback(done, StartDaemon()); | 470 InvokeCompletionCallback(done, StartDaemon()); |
469 } | 471 } |
470 | 472 |
471 scoped_refptr<DaemonController> DaemonController::Create() { | 473 scoped_refptr<DaemonController> DaemonController::Create() { |
472 return new DaemonController( | 474 return new DaemonController( |
473 make_scoped_ptr(new DaemonControllerDelegateWin())); | 475 base::WrapUnique(new DaemonControllerDelegateWin())); |
474 } | 476 } |
475 | 477 |
476 } // namespace remoting | 478 } // namespace remoting |
OLD | NEW |