OLD | NEW |
| (Empty) |
1 // Copyright 2008-2010 Google Inc. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 // ======================================================================== | |
15 | |
16 | |
17 #include "omaha/goopdate/process_launcher.h" | |
18 #include "omaha/base/browser_utils.h" | |
19 #include "omaha/base/const_object_names.h" | |
20 #include "omaha/base/debug.h" | |
21 #include "omaha/base/exception_barrier.h" | |
22 #include "omaha/base/logging.h" | |
23 #include "omaha/base/system.h" | |
24 #include "omaha/base/vista_utils.h" | |
25 #include "omaha/base/vistautil.h" | |
26 #include "omaha/core/google_update_core.h" | |
27 | |
28 namespace omaha { | |
29 | |
30 ProcessLauncher::ProcessLauncher() : StdMarshalInfo(true) { | |
31 CORE_LOG(L6, (_T("[ProcessLauncher::ProcessLauncher]"))); | |
32 } | |
33 | |
34 ProcessLauncher::~ProcessLauncher() { | |
35 CORE_LOG(L6, (_T("[ProcessLauncher::~ProcessLauncher]"))); | |
36 } | |
37 | |
38 STDMETHODIMP ProcessLauncher::LaunchCmdLine(const TCHAR* cmd_line) { | |
39 CORE_LOG(L1, (_T("[ProcessLauncher::LaunchCmdLine][%s]"), cmd_line)); | |
40 // The exception barrier is needed, because any exceptions that are thrown | |
41 // in this method will get caught by the COM run time. We compile with | |
42 // exceptions off, and do not expect to throw any exceptions. This barrier | |
43 // will treat an exception in this method as a unhandled exception. | |
44 ExceptionBarrier barrier; | |
45 if (cmd_line == NULL) { | |
46 return E_INVALIDARG; | |
47 } | |
48 | |
49 // http://b/3329538: In the impersonated case, need to create a fresh | |
50 // environment block and ::CreateProcess. RunAsCurrentUser does just that. | |
51 HRESULT hr = vista::RunAsCurrentUser(cmd_line); | |
52 if (FAILED(hr)) { | |
53 UTIL_LOG(LW, (_T("[RunAsCurrentUser failed][0x%x]"), hr)); | |
54 } | |
55 return hr; | |
56 } | |
57 | |
58 STDMETHODIMP ProcessLauncher::LaunchBrowser(DWORD type, const TCHAR* url) { | |
59 CORE_LOG(L1, (_T("[ProcessLauncher::LaunchBrowser][%d][%s]"), type, url)); | |
60 // The exception barrier is needed, because any exceptions that are thrown | |
61 // in this method will get caught by the COM run time. We compile with | |
62 // exceptions off, and do not expect to throw any exceptions. This barrier | |
63 // will treat an exception in this method as a unhandled exception. | |
64 ExceptionBarrier barrier; | |
65 if (type >= BROWSER_MAX || url == NULL) { | |
66 return E_INVALIDARG; | |
67 } | |
68 return RunBrowser(static_cast<BrowserType>(type), url); | |
69 } | |
70 | |
71 // This method delegates to the internal interface exposed by the system | |
72 // service, and if the service cannot be instantiated, exposed by a Local COM | |
73 // Server. | |
74 // | |
75 // Non elevated callers can request a command to be run elevated. | |
76 // The command must be registered before by elevated code to prevent | |
77 // launching untrusted commands. The security of the command is based on | |
78 // having the correct registry ACLs for the machine Omaha registry. | |
79 STDMETHODIMP ProcessLauncher::LaunchCmdElevated(const WCHAR* app_guid, | |
80 const WCHAR* cmd_id, | |
81 DWORD caller_proc_id, | |
82 ULONG_PTR* proc_handle) { | |
83 CORE_LOG(L3, (_T("[ProcessLauncher::LaunchCmdElevated]") | |
84 _T("[app %s][cmd %s][pid %d]"), | |
85 app_guid, cmd_id, caller_proc_id)); | |
86 | |
87 ExceptionBarrier barrier; | |
88 | |
89 ASSERT1(app_guid); | |
90 ASSERT1(cmd_id); | |
91 ASSERT1(proc_handle); | |
92 | |
93 CComPtr<IGoogleUpdateCore> google_update_core; | |
94 HRESULT hr = | |
95 google_update_core.CoCreateInstance(__uuidof(GoogleUpdateCoreClass)); | |
96 | |
97 if (FAILED(hr)) { | |
98 CORE_LOG(LE, (_T("[CoCreate GoogleUpdateCoreClass failed][0x%x]"), hr)); | |
99 | |
100 if (!vista_util::IsVistaOrLater() && !vista_util::IsUserAdmin()) { | |
101 return hr; | |
102 } | |
103 | |
104 hr = System::CoCreateInstanceAsAdmin(NULL, | |
105 __uuidof(GoogleUpdateCoreMachineClass), | |
106 IID_PPV_ARGS(&google_update_core)); | |
107 if (FAILED(hr)) { | |
108 CORE_LOG(LE, (_T("[GoogleUpdateCoreMachineClass failed][0x%x]"), hr)); | |
109 return hr; | |
110 } | |
111 } | |
112 | |
113 ASSERT1(google_update_core); | |
114 hr = ::CoSetProxyBlanket(google_update_core, RPC_C_AUTHN_DEFAULT, | |
115 RPC_C_AUTHZ_DEFAULT, COLE_DEFAULT_PRINCIPAL, RPC_C_AUTHN_LEVEL_DEFAULT, | |
116 RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT); | |
117 if (FAILED(hr)) { | |
118 return hr; | |
119 } | |
120 | |
121 return google_update_core->LaunchCmdElevated(app_guid, | |
122 cmd_id, | |
123 caller_proc_id, | |
124 proc_handle); | |
125 } | |
126 | |
127 } // namespace omaha | |
128 | |
OLD | NEW |