Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Unified Diff: remoting/host/remoting_me2me_host.cc

Issue 834673007: Issue 356320: Pinless entry not working on Windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..401aba04db8ed2f1a8190d569ec05ab0356f4d43 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,7 @@ class HostProcess
int* exit_code_out_;
bool signal_parent_;
- scoped_ptr<PairingRegistry::Delegate> pairing_registry_delegate_;
+ scoped_refptr<PairingRegistry> pairing_registry_;
ShutdownWatchdog* shutdown_watchdog_;
};
@@ -608,24 +617,31 @@ void HostProcess::CreateAuthenticatorFactory() {
return;
}
- scoped_refptr<PairingRegistry> pairing_registry = NULL;
- if (allow_pairing_) {
- if (!pairing_registry_delegate_)
- pairing_registry_delegate_ = CreatePairingRegistryDelegate();
-
- if (pairing_registry_delegate_) {
- pairing_registry = new PairingRegistry(context_->file_task_runner(),
- pairing_registry_delegate_.Pass());
- }
- }
-
scoped_ptr<protocol::AuthenticatorFactory> factory;
if (third_party_auth_config_.is_empty()) {
+ scoped_refptr<PairingRegistry> pairing_registry;
+ if (allow_pairing_) {
+ // On Windows |pairing_registry_| is initialized in
+ // InitializePairingRegistry().
+#if !defined(OS_WIN)
+ if (!pairing_registry_) {
+ scoped_ptr<PairingRegistry::Delegate> delegate(
+ CreatePairingRegistryDelegate());
Sergey Ulanov 2015/01/08 17:34:02 nit: this would be more readable with assignment:
weitao 2015/01/08 17:56:29 Done.
+
+ pairing_registry_ = new PairingRegistry(context_->file_task_runner(),
+ delegate.Pass());
Sergey Ulanov 2015/01/08 17:34:02 nit: indentation.
weitao 2015/01/08 17:56:29 Done.
+ }
+#endif // defined(OS_WIN)
+
+ pairing_registry = pairing_registry_;
+ }
+
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 +668,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 +817,45 @@ 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);
+ // |pairing_registry_| should only be initialized once.
+ DCHECK(!pairing_registry_);
+
+ HKEY privileged_hkey = reinterpret_cast<HKEY>(
+ IPC::PlatformFileForTransitToPlatformFile(privileged_key));
+ HKEY unprivileged_hkey = reinterpret_cast<HKEY>(
+ IPC::PlatformFileForTransitToPlatformFile(unprivileged_key));
+
+ scoped_ptr<PairingRegistryDelegateWin> delegate(
+ new PairingRegistryDelegateWin());
+ delegate->SetRootKeys(privileged_hkey, unprivileged_hkey);
+
+ pairing_registry_ = new PairingRegistry(context_->file_task_runner(),
+ delegate.Pass());
+
+ // (Re)Create the authenticator factory now that |pairing_registry_| has been
+ // initialized.
+ 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());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698