Chromium Code Reviews| Index: remoting/host/remoting_me2me_host.cc |
| diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc |
| index 32f3f18a4f123af05967456f563157366cbe2724..3f3ed5118c7704a63bc4c9315d35e6faaf2a109c 100644 |
| --- a/remoting/host/remoting_me2me_host.cc |
| +++ b/remoting/host/remoting_me2me_host.cc |
| @@ -171,7 +171,8 @@ class HostProcess |
| // HostChangeNotificationListener::Listener overrides. |
| void OnHostDeleted() override; |
| - // Initializes the pairing registry on Windows. |
| + // Handler of the ChromotingDaemonNetworkMsg_InitializePairingRegistry IPC |
| + // message. |
| void OnInitializePairingRegistry( |
| IPC::PlatformFileForTransit privileged_key, |
| IPC::PlatformFileForTransit unprivileged_key); |
| @@ -271,6 +272,14 @@ class HostProcess |
| void OnPolicyWatcherShutdown(); |
| +#if defined(OS_WIN) |
| + // Initializes the pairing registry on Windows. This should be invoked on the |
| + // network thread. |
| + void InitializePairingRegistry( |
| + IPC::PlatformFileForTransit privileged_key, |
| + IPC::PlatformFileForTransit unprivileged_key); |
| +#endif // defined(OS_WIN) |
| + |
| // Crashes the process in response to a daemon's request. The daemon passes |
| // the location of the code that detected the fatal error resulted in this |
| // request. |
| @@ -352,7 +361,11 @@ class HostProcess |
| int* exit_code_out_; |
| bool signal_parent_; |
| - scoped_ptr<PairingRegistry::Delegate> pairing_registry_delegate_; |
| +#if defined(OS_WIN) |
| + // The registry keys for pinless authentication. |
| + HKEY privileged_key_; |
| + HKEY unprivileged_key_; |
| +#endif // defined(OS_WIN) |
| ShutdownWatchdog* shutdown_watchdog_; |
| }; |
| @@ -381,6 +394,8 @@ HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
| self_(this), |
| exit_code_out_(exit_code_out), |
| signal_parent_(false), |
| + privileged_key_(NULL), |
| + unprivileged_key_(NULL), |
| shutdown_watchdog_(shutdown_watchdog) { |
| StartOnUiThread(); |
| } |
| @@ -608,24 +623,31 @@ void HostProcess::CreateAuthenticatorFactory() { |
| return; |
| } |
| - scoped_refptr<PairingRegistry> pairing_registry = NULL; |
| - if (allow_pairing_) { |
| - if (!pairing_registry_delegate_) |
| - pairing_registry_delegate_ = CreatePairingRegistryDelegate(); |
| + scoped_ptr<protocol::AuthenticatorFactory> factory; |
| + |
| + if (third_party_auth_config_.is_empty()) { |
| + scoped_refptr<PairingRegistry> pairing_registry = NULL; |
|
Sergey Ulanov
2015/01/07 20:26:43
don't need to set it to NULL explicitly. Also use
weitao
2015/01/08 00:13:36
Done.
|
| + if (allow_pairing_) { |
| + scoped_ptr<PairingRegistry::Delegate> delegate( |
| + CreatePairingRegistryDelegate()); |
| + |
| +#if defined(OS_WIN) |
| + if (unprivileged_key_) { |
|
Sergey Ulanov
2015/01/07 20:26:43
On windows there is no point creating PairingRegis
weitao
2015/01/08 00:13:36
Done.
|
| + PairingRegistryDelegateWin* delegate_win = |
| + reinterpret_cast<PairingRegistryDelegateWin*>(delegate.get()); |
|
Sergey Ulanov
2015/01/07 20:26:43
Ouch, reinterpret_cast<>! You can avoid it, see my
weitao
2015/01/08 00:13:36
Done.
|
| + delegate_win->SetRootKeys(privileged_key_, unprivileged_key_); |
| + } |
| +#endif // defined(OS_WIN) |
| - if (pairing_registry_delegate_) { |
| pairing_registry = new PairingRegistry(context_->file_task_runner(), |
|
Sergey Ulanov
2015/01/07 20:26:43
We don't really need a new instance of PairingRegi
weitao
2015/01/08 00:13:35
Done.
|
| - pairing_registry_delegate_.Pass()); |
| + delegate.Pass()); |
| } |
| - } |
| - |
| - scoped_ptr<protocol::AuthenticatorFactory> factory; |
| - if (third_party_auth_config_.is_empty()) { |
| factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithSharedSecret( |
| use_service_account_, host_owner_, local_certificate, key_pair_, |
| host_secret_hash_, pairing_registry); |
| + host_->set_pairing_registry(pairing_registry); |
| } else if (third_party_auth_config_.is_valid()) { |
| scoped_ptr<protocol::TokenValidatorFactory> token_validator_factory( |
| new TokenValidatorFactoryImpl( |
| @@ -652,8 +674,6 @@ void HostProcess::CreateAuthenticatorFactory() { |
| factory.reset(new PamAuthorizationFactory(factory.Pass())); |
| #endif |
| host_->SetAuthenticatorFactory(factory.Pass()); |
| - |
| - host_->set_pairing_registry(pairing_registry); |
| } |
| // IPC::Listener implementation. |
| @@ -803,26 +823,41 @@ void HostProcess::OnHostDeleted() { |
| void HostProcess::OnInitializePairingRegistry( |
| IPC::PlatformFileForTransit privileged_key, |
| IPC::PlatformFileForTransit unprivileged_key) { |
| - DCHECK(!pairing_registry_delegate_); |
| + DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); |
| #if defined(OS_WIN) |
| - // Initialize the pairing registry delegate. |
| - scoped_ptr<PairingRegistryDelegateWin> delegate( |
| - new PairingRegistryDelegateWin()); |
| - bool result = delegate->SetRootKeys( |
| - reinterpret_cast<HKEY>( |
| - IPC::PlatformFileForTransitToPlatformFile(privileged_key)), |
| - reinterpret_cast<HKEY>( |
| - IPC::PlatformFileForTransitToPlatformFile(unprivileged_key))); |
| - if (!result) |
| - return; |
| - |
| - pairing_registry_delegate_ = delegate.Pass(); |
| + context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( |
| + &HostProcess::InitializePairingRegistry, |
| + this, privileged_key, unprivileged_key)); |
| #else // !defined(OS_WIN) |
| NOTREACHED(); |
| #endif // !defined(OS_WIN) |
| } |
| +#if defined(OS_WIN) |
| +void HostProcess::InitializePairingRegistry( |
| + IPC::PlatformFileForTransit privileged_key, |
| + IPC::PlatformFileForTransit unprivileged_key) { |
| + DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| + |
| + // |privileged_key| can be NULL but not |unprivileged_key|. |
| + DCHECK(unprivileged_key); |
| + |
| + // |privileged_key_| and |unprivileged_key_| will only be initialized once. |
| + DCHECK(!privileged_key_); |
| + DCHECK(!unprivileged_key_); |
| + |
| + privileged_key_ = reinterpret_cast<HKEY>( |
| + IPC::PlatformFileForTransitToPlatformFile(privileged_key)), |
| + unprivileged_key_ = reinterpret_cast<HKEY>( |
| + IPC::PlatformFileForTransitToPlatformFile(unprivileged_key)); |
| + |
| + // (Re)Create the authenticator factory now that we have received the |
| + // registry keys for pinless auth. |
| + CreateAuthenticatorFactory(); |
| +} |
| +#endif // !defined(OS_WIN) |
| + |
| // Applies the host config, returning true if successful. |
| bool HostProcess::ApplyConfig(const base::DictionaryValue& config) { |
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |