summaryrefslogtreecommitdiffstats
path: root/remoting
diff options
context:
space:
mode:
authoralexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-17 18:41:59 +0000
committeralexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-17 18:41:59 +0000
commitb29bd891a10d78ac675e5e9074bacdb97ba82286 (patch)
treea9854c746de3261df42d6120b84f3856ce452785 /remoting
parent74174cc887b62e183c2b208ec7416af84ac16e93 (diff)
downloadchromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.zip
chromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.tar.gz
chromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.tar.bz2
[Chromoting] Avoid potential conflicts leading to pending reboots while upgrading the me2me host:
- Install the host binaries to versioned folders. - Drop references to the COM objects quickly. - Auto-generate CLSID of the daemon controller at GYP time. This makes sure that a freshly installed version of the controller will be launched after upgrade even if there is already running instance cached by RPCSS. This CL restores https://chromiumcodereview.appspot.com/10831037 (r148671) and https://chromiumcodereview.appspot.com/10837087 (r149866) previously reverted by r150494. Unlike the previous two CLs this one does not require GYP changes (that is changes to GYP itself, not .gyp files). BUG=137755 Review URL: https://chromiumcodereview.appspot.com/10828352 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152120 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
-rw-r--r--remoting/host/plugin/daemon_controller_win.cc22
-rw-r--r--remoting/host/win/chromoting.wxs20
-rw-r--r--remoting/host/win/elevated_controller.h7
-rw-r--r--remoting/host/win/elevated_controller_idl.templ (renamed from remoting/host/win/elevated_controller.idl)2
-rw-r--r--remoting/remoting.gyp30
-rwxr-xr-xremoting/tools/candle_and_light.py2
-rwxr-xr-xremoting/tools/uuidgen.py18
7 files changed, 86 insertions, 15 deletions
diff --git a/remoting/host/plugin/daemon_controller_win.cc b/remoting/host/plugin/daemon_controller_win.cc
index 2d8082c..2985652 100644
--- a/remoting/host/plugin/daemon_controller_win.cc
+++ b/remoting/host/plugin/daemon_controller_win.cc
@@ -51,8 +51,17 @@ const wchar_t kDaemonControllerElevationMoniker[] =
// Name of the Daemon Controller's worker thread.
const char kDaemonControllerThreadName[] = "Daemon Controller thread";
-// The maximum interval between showing UAC prompts.
-const int kUacTimeoutSec = 15 * 60;
+// The maximum duration of keeping a reference to a privileged instance of
+// the Daemon Controller. This effectively reduces number of UAC prompts a user
+// sees.
+const int kPrivilegedTimeoutSec = 5 * 60;
+
+// The maximum duration of keeping a reference to an unprivileged instance of
+// the Daemon Controller. This interval should not be too long. If upgrade
+// happens while there is a live reference to a Daemon Controller instance
+// the old binary still can be used. So dropping the references often makes sure
+// that the old binary will go away sooner.
+const int kUnprivilegedTimeoutSec = 60;
// A base::Thread implementation that initializes COM on the new thread.
class ComThread : public base::Thread {
@@ -296,6 +305,13 @@ HRESULT DaemonControllerWin::ActivateController() {
// Ignore the error. IID_IDaemonControl2 is optional.
control_.QueryInterface(IID_IDaemonControl2, control2_.ReceiveVoid());
+
+ // Release |control_| upon expiration of the timeout.
+ release_timer_.reset(new base::OneShotTimer<DaemonControllerWin>());
+ release_timer_->Start(FROM_HERE,
+ base::TimeDelta::FromSeconds(kUnprivilegedTimeoutSec),
+ this,
+ &DaemonControllerWin::ReleaseController);
}
return S_OK;
@@ -339,7 +355,7 @@ HRESULT DaemonControllerWin::ActivateElevatedController() {
// Release |control_| upon expiration of the timeout.
release_timer_.reset(new base::OneShotTimer<DaemonControllerWin>());
release_timer_->Start(FROM_HERE,
- base::TimeDelta::FromSeconds(kUacTimeoutSec),
+ base::TimeDelta::FromSeconds(kPrivilegedTimeoutSec),
this,
&DaemonControllerWin::ReleaseController);
}
diff --git a/remoting/host/win/chromoting.wxs b/remoting/host/win/chromoting.wxs
index 57f8789..bf8170f 100644
--- a/remoting/host/win/chromoting.wxs
+++ b/remoting/host/win/chromoting.wxs
@@ -26,7 +26,6 @@
<?define ControllerAppid = "{4ff35d5e-d226-4550-9248-03e7779e67de}" ?>
<?define ControllerBinary = "remoting_host_controller.exe" ?>
<?define ControllerClass = "ElevatedController Class" ?>
- <?define ControllerClsid = "{430a9403-8176-4733-afdc-0b325a8fda84}" ?>
<?define ControllerProgid =
"ChromotingElevatedController.ElevatedController" ?>
<?define ControllerTypelib = "{9d9a5a2c-576e-4acd-9c75-aabff74b205d}" ?>
@@ -44,6 +43,10 @@
-->
<?define ControllerSd = "010004805C0000006C00000000000000140000000200480003000000000014000300000001010000000000050400000000001400030000000101000000000005120000000000180003000000010200000000000520000000200200000102000000000005200000002002000001020000000000052000000020020000" ?>
+ <?ifndef ControllerClsid ?>
+ <?error ControllerClsid must be defined ?>
+ <?endif?>
+
<?ifndef FileSource ?>
<?error FileSource must be defined ?>
<?endif?>
@@ -90,10 +93,14 @@
<Directory Id="ProgramFilesFolder">
<?ifdef OfficialBuild ?>
<Directory Id="program_files_google" Name="Google">
- <Directory Id="binaries" Name="Chrome Remote Desktop"/>
+ <Directory Id="chromoting" Name="Chrome Remote Desktop">
+ <Directory Id="binaries" Name="$(var.Version)"/>
+ </Directory>
</Directory>
<?else?>
- <Directory Id="binaries" Name="Chromoting"/>
+ <Directory Id="chromoting" Name="Chromoting">
+ <Directory Id="binaries" Name="$(var.Version)"/>
+ </Directory>
<?endif?>
</Directory>
<Directory Id="CommonAppDataFolder">
@@ -217,11 +224,12 @@
<RegistryKey Key="CurVer" Action="create">
<RegistryValue Type="string"
- Value="$(var.ControllerProgid).1"/>
+ Value="$(var.ControllerProgid).$(var.Version)"/>
</RegistryKey>
</RegistryKey>
- <RegistryKey Key="$(var.ControllerProgid).1" Action="create">
+ <RegistryKey Key="$(var.ControllerProgid).$(var.Version)"
+ Action="create">
<RegistryValue Type="string"
Value="$(var.ControllerClass)"/>
@@ -251,7 +259,7 @@
<RegistryKey Key="ProgID" Action="create">
<RegistryValue Type="string"
- Value="$(var.ControllerProgid).1"/>
+ Value="$(var.ControllerProgid).$(var.Version)"/>
</RegistryKey>
<RegistryKey Key="TypeLib" Action="create">
diff --git a/remoting/host/win/elevated_controller.h b/remoting/host/win/elevated_controller.h
index dc33e1e..23bd3a5 100644
--- a/remoting/host/win/elevated_controller.h
+++ b/remoting/host/win/elevated_controller.h
@@ -16,9 +16,10 @@
namespace remoting {
-class ATL_NO_VTABLE ElevatedController
+class ATL_NO_VTABLE __declspec(uuid(DAEMON_CONTROLLER_CLSID)) ElevatedController
: public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>,
- public ATL::CComCoClass<ElevatedController, &CLSID_ElevatedController>,
+ public ATL::CComCoClass<ElevatedController,
+ &__uuidof(ElevatedController)>,
public ATL::IDispatchImpl<IDaemonControl2, &IID_IDaemonControl2,
&LIBID_ChromotingElevatedControllerLib, 1, 1> {
public:
@@ -57,7 +58,7 @@ class ATL_NO_VTABLE ElevatedController
DECLARE_PROTECT_FINAL_CONSTRUCT()
};
-OBJECT_ENTRY_AUTO(CLSID_ElevatedController, ElevatedController)
+OBJECT_ENTRY_AUTO(__uuidof(ElevatedController), ElevatedController)
} // namespace remoting
diff --git a/remoting/host/win/elevated_controller.idl b/remoting/host/win/elevated_controller_idl.templ
index 590b8dd..27b15ae 100644
--- a/remoting/host/win/elevated_controller.idl
+++ b/remoting/host/win/elevated_controller_idl.templ
@@ -73,7 +73,7 @@ library ChromotingElevatedControllerLib {
importlib("stdole2.tlb");
[
- uuid(430a9403-8176-4733-afdc-0b325a8fda84),
+ uuid(@DAEMON_CONTROLLER_CLSID@),
helpstring("ElevatedController Class")
]
coclass ElevatedController {
diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp
index 8b0fbd4..6154111 100644
--- a/remoting/remoting.gyp
+++ b/remoting/remoting.gyp
@@ -118,6 +118,12 @@
'webapp/_locales/en/messages.json',
],
}],
+ ['OS=="win"', {
+ # Use auto-generated CLSID for the daemon controller to make sure that
+ # the newly installed version of the controller will be used during
+ # upgrade even if there is an old instance running already.
+ 'daemon_controller_clsid': '<!(python tools/uuidgen.py)',
+ }],
],
'remoting_webapp_files': [
'resources/chromoting16.png',
@@ -508,13 +514,13 @@
'tools/breakpad_tester_win.cc',
],
}, # end of target 'remoting_breakpad_tester'
-
{
'target_name': 'remoting_elevated_controller',
'type': 'static_library',
'sources': [
- 'host/win/elevated_controller.idl',
+ 'host/win/elevated_controller_idl.templ',
'<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.h',
+ '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.idl',
'<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller_i.c',
],
# This target exports a hard dependency because dependent targets may
@@ -530,6 +536,24 @@
'<(SHARED_INTERMEDIATE_DIR)',
],
},
+ 'rules': [
+ {
+ 'rule_name': 'generate_idl',
+ 'extension': 'templ',
+ 'outputs': [
+ '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.idl',
+ ],
+ 'action': [
+ 'python',
+ '<(version_py_path)',
+ '-e', 'DAEMON_CONTROLLER_CLSID="<(daemon_controller_clsid)"',
+ '<(RULE_INPUT_PATH)',
+ '<@(_outputs)',
+ ],
+ 'process_outputs_as_sources': 1,
+ 'message': 'Generating <@(_outputs)'
+ },
+ ],
}, # end of target 'remoting_elevated_controller'
{
'target_name': 'remoting_host_controller',
@@ -540,6 +564,7 @@
'_ATL_NO_AUTOMATIC_NAMESPACE',
'_ATL_CSTRING_EXPLICIT_CONSTRUCTORS',
'STRICT',
+ 'DAEMON_CONTROLLER_CLSID="{<(daemon_controller_clsid)}"',
],
'include_dirs': [
'<(INTERMEDIATE_DIR)',
@@ -767,6 +792,7 @@
'action': [
'python', 'tools/candle_and_light.py',
'--wix_path', '<(wix_path)',
+ '--controller_clsid', '{<(daemon_controller_clsid)}',
'--version', '<(version_full)',
'--product_dir', '<(PRODUCT_DIR).',
'--intermediate_dir', '<(INTERMEDIATE_DIR).',
diff --git a/remoting/tools/candle_and_light.py b/remoting/tools/candle_and_light.py
index 056bffd..74a2572 100755
--- a/remoting/tools/candle_and_light.py
+++ b/remoting/tools/candle_and_light.py
@@ -23,6 +23,7 @@ def main():
parser = OptionParser()
parser.add_option('--wix_path', dest='wix_path')
parser.add_option('--version', dest='version')
+ parser.add_option('--controller_clsid', dest='controller_clsid')
parser.add_option('--product_dir', dest='product_dir')
parser.add_option('--intermediate_dir', dest='intermediate_dir')
parser.add_option('--sas_dll_path', dest='sas_dll_path')
@@ -42,6 +43,7 @@ def main():
'-ext "%(wix_path)s\\WixFirewallExtension.dll" '
'-ext "%(wix_path)s\\WixUIExtension.dll" '
'-ext "%(wix_path)s\\WixUtilExtension.dll" '
+ '"-dControllerClsid="%(controller_clsid)s"" '
'-dVersion=%(version)s '
'"-dFileSource=%(product_dir)s" '
'-dIconPath=resources/chromoting.ico '
diff --git a/remoting/tools/uuidgen.py b/remoting/tools/uuidgen.py
new file mode 100755
index 0000000..ed1e415
--- /dev/null
+++ b/remoting/tools/uuidgen.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+uuidgen.py -- UUID generation utility.
+"""
+
+import sys
+import uuid
+
+def main():
+ print uuid.uuid4()
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())