Chromium Code Reviews| Index: remoting/host/elevated_controller_win.cc |
| diff --git a/remoting/host/elevated_controller_win.cc b/remoting/host/elevated_controller_win.cc |
| index ac47f84af6f59cbb5b57379bf46c0b457dafed1c..0cca5e7f8bd8c002a2b4a598c9097bf8cd96fcc9 100644 |
| --- a/remoting/host/elevated_controller_win.cc |
| +++ b/remoting/host/elevated_controller_win.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/values.h" |
| #include "base/win/scoped_handle.h" |
| #include "remoting/host/branding.h" |
| +#include "remoting/host/daemon_controller_common_win.h" |
| #include "remoting/host/elevated_controller_resource.h" |
| #include "remoting/host/verify_config_window_win.h" |
| @@ -33,20 +34,20 @@ const FilePath::CharType kTempFileExtension[] = FILE_PATH_LITERAL("json~"); |
| const char16 kConfigFileSecurityDescriptor[] = |
| TO_L_STRING("O:BAG:BAD:(A;;GA;;;SY)(A;;GA;;;BA)"); |
| -// The maximum size of the configuration file. "1MB ought to be enough" for any |
| -// reasonable configuration we will ever need. 1MB is low enough to make |
| -// the probability of out of memory situation fairly low. OOM is still possible |
| -// and we will crash if it occurs. |
| -const size_t kMaxConfigFileSize = 1024 * 1024; |
| +const char16 kUnprivilegedConfigFileSecurityDescriptor[] = |
| + TO_L_STRING("O:BAG:BAD:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GR;;;AU)"); |
| -// ReadConfig() filters the configuration file stripping all variables except of |
| -// the following two. |
| +// Configuration keys. |
| const char kHostId[] = "host_id"; |
| const char kXmppLogin[] = "xmpp_login"; |
| +const char kHostSecretHash[] = "host_secret_hash"; |
| // The configuration keys that cannot be specified in UpdateConfig(). |
| const char* const kReadonlyKeys[] = { kHostId, kXmppLogin }; |
| +// The configuration keys whose values may be read by GetConfig(). |
| +const char* const kUnprivilegedConfigKeys[] = { kHostId, kXmppLogin }; |
|
alexeypa (please no reviews)
2012/04/23 17:35:10
kReadonlyKeys and kUnprivilegedConfigKeys strangel
simonmorris
2012/04/23 19:39:49
Yes, but is it clear that the two sets will always
alexeypa (please no reviews)
2012/04/24 16:54:56
As per our discussion these lists are not the same
simonmorris
2012/04/25 00:33:32
crbug.com/124825
|
| + |
| // Reads and parses the configuration file up to |kMaxConfigFileSize| in |
| // size. |
| HRESULT ReadConfig(const FilePath& filename, |
|
alexeypa (please no reviews)
2012/04/23 17:35:10
Is ReadConfig used now, when GetCOnfig is implemen
simonmorris
2012/04/23 19:39:49
No, but there's no need to use this CL to remove i
alexeypa (please no reviews)
2012/04/24 16:54:56
Please include this into the COM interfaces cleanu
simonmorris
2012/04/25 00:33:32
crbug.com/124937
|
| @@ -69,8 +70,8 @@ HRESULT ReadConfig(const FilePath& filename, |
| return HRESULT_FROM_WIN32(error); |
| } |
| - scoped_array<char> buffer(new char[kMaxConfigFileSize]); |
| - DWORD size = kMaxConfigFileSize; |
| + scoped_array<char> buffer(new char[remoting::kMaxConfigFileSize]); |
| + DWORD size = remoting::kMaxConfigFileSize; |
| if (!::ReadFile(file, &buffer[0], size, &size, NULL)) { |
| DWORD error = GetLastError(); |
| LOG_GETLASTERROR(ERROR) |
| @@ -94,44 +95,18 @@ HRESULT ReadConfig(const FilePath& filename, |
| return S_OK; |
| } |
| -// Writes the configuration file up to |kMaxConfigFileSize| in size. |
| -HRESULT WriteConfig(const FilePath& filename, |
| - const char* content, |
| - size_t length) { |
| - if (length > kMaxConfigFileSize) { |
| - return E_FAIL; |
| - } |
| - |
| - // Extract the configuration data that the user will verify. |
| - scoped_ptr<base::Value> config_value(base::JSONReader::Read(content)); |
| - if (!config_value.get()) { |
| - return E_FAIL; |
| - } |
| - base::DictionaryValue* config_dict = NULL; |
| - if (!config_value->GetAsDictionary(&config_dict)) { |
| - return E_FAIL; |
| - } |
| - std::string email, host_id, host_secret_hash; |
| - if (!config_dict->GetString("xmpp_login", &email) || |
| - !config_dict->GetString("host_id", &host_id) || |
| - !config_dict->GetString("host_secret_hash", &host_secret_hash)) { |
| - return E_FAIL; |
| - } |
| - |
| - // Ask the user to verify the configuration. |
| - remoting::VerifyConfigWindowWin verify_win(email, host_id, host_secret_hash); |
| - if (!verify_win.Run()) { |
| - return E_FAIL; |
| - } |
| - |
| +HRESULT WriteConfigFile(bool privileged, const char* content, size_t length) { |
| // Create a security descriptor for the configuration file. |
| SECURITY_ATTRIBUTES security_attributes; |
| security_attributes.nLength = sizeof(security_attributes); |
| security_attributes.bInheritHandle = FALSE; |
| ULONG security_descriptor_length = 0; |
| + const char16* descriptor = privileged ? |
|
alexeypa (please no reviews)
2012/04/23 17:35:10
I somehow feel that passing ACL and filename to th
simonmorris
2012/04/23 19:39:49
Done.
|
| + kConfigFileSecurityDescriptor : |
| + kUnprivilegedConfigFileSecurityDescriptor; |
| if (!ConvertStringSecurityDescriptorToSecurityDescriptorW( |
| - kConfigFileSecurityDescriptor, |
| + descriptor, |
| SDDL_REVISION_1, |
| reinterpret_cast<PSECURITY_DESCRIPTOR*>( |
| &security_attributes.lpSecurityDescriptor), |
| @@ -143,6 +118,10 @@ HRESULT WriteConfig(const FilePath& filename, |
| } |
| // Create a temporary file and write configuration to it. |
| + const FilePath::CharType* basename = privileged ? |
| + kConfigFileName : |
| + remoting::kUnprivilegedConfigFileName; |
| + FilePath filename = remoting::GetConfigDir().Append(basename); |
| FilePath tempname = filename.ReplaceExtension(kTempFileExtension); |
| { |
| base::win::ScopedHandle file( |
| @@ -185,6 +164,62 @@ HRESULT WriteConfig(const FilePath& filename, |
| return S_OK; |
| } |
| +// Writes the configuration file up to |kMaxConfigFileSize| in size. |
| +HRESULT WriteConfig(const char* content, size_t length) { |
| + if (length > remoting::kMaxConfigFileSize) { |
| + return E_FAIL; |
| + } |
| + |
| + // Extract the configuration data that the user will verify. |
| + scoped_ptr<base::Value> config_value(base::JSONReader::Read(content)); |
| + if (!config_value.get()) { |
| + return E_FAIL; |
| + } |
| + base::DictionaryValue* config_dict = NULL; |
| + if (!config_value->GetAsDictionary(&config_dict)) { |
| + return E_FAIL; |
| + } |
| + std::string email, host_id, host_secret_hash; |
| + if (!config_dict->GetString(kXmppLogin, &email) || |
| + !config_dict->GetString(kHostId, &host_id) || |
| + !config_dict->GetString(kHostSecretHash, &host_secret_hash)) { |
| + return E_FAIL; |
| + } |
| + |
| + // Ask the user to verify the configuration. |
| + remoting::VerifyConfigWindowWin verify_win(email, host_id, host_secret_hash); |
| + if (!verify_win.Run()) { |
| + return E_FAIL; |
| + } |
| + |
| + // Write the full configuration file. |
| + HRESULT hr = WriteConfigFile(true, content, length); |
| + if (FAILED(hr)) { |
| + return hr; |
| + } |
| + |
| + // Extract the unprivileged fields from the configuration. |
| + base::DictionaryValue unprivileged_config_dict; |
| + for (int i = 0; i < arraysize(kUnprivilegedConfigKeys); ++i) { |
| + const char* key = kUnprivilegedConfigKeys[i]; |
| + string16 value; |
| + if (config_dict->GetString(key, &value)) { |
| + unprivileged_config_dict.SetString(key, value); |
| + } |
| + } |
| + std::string unprivileged_config_str; |
| + base::JSONWriter::Write(&unprivileged_config_dict, &unprivileged_config_str); |
| + |
| + // Write the unprivileged configuration file. |
| + hr = WriteConfigFile(false, |
| + unprivileged_config_str.data(), |
| + unprivileged_config_str.size()); |
| + if (FAILED(hr)) { |
| + return hr; |
| + } |
| + |
| + return S_OK; |
| +} |
| } // namespace |
| @@ -244,9 +279,7 @@ STDMETHODIMP ElevatedControllerWin::SetConfig(BSTR config) { |
| std::string file_content = UTF16ToUTF8( |
| string16(static_cast<char16*>(config), ::SysStringLen(config))); |
| - return WriteConfig(config_dir.Append(kConfigFileName), |
| - file_content.c_str(), |
| - file_content.size()); |
| + return WriteConfig(file_content.c_str(), file_content.size()); |
| } |
| STDMETHODIMP ElevatedControllerWin::StartDaemon() { |
| @@ -359,9 +392,7 @@ STDMETHODIMP ElevatedControllerWin::UpdateConfig(BSTR config) { |
| // Write the updated config. |
| std::string config_updated_str; |
| base::JSONWriter::Write(config_old.get(), &config_updated_str); |
| - return WriteConfig(config_dir.Append(kConfigFileName), |
| - config_updated_str.c_str(), |
| - config_updated_str.size()); |
| + return WriteConfig(config_updated_str.c_str(), config_updated_str.size()); |
| } |
| HRESULT ElevatedControllerWin::OpenService(ScopedScHandle* service_out) { |