| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/terminal/terminal_private_api.h" | 5 #include "chrome/browser/extensions/api/terminal/terminal_private_api.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "chrome/browser/chromeos/process_proxy/process_proxy_registry.h" | 10 #include "chrome/browser/chromeos/process_proxy/process_proxy_registry.h" |
| 11 #include "chrome/browser/chromeos/system/runtime_environment.h" | 11 #include "chrome/browser/chromeos/system/runtime_environment.h" |
| 12 #include "chrome/browser/extensions/api/terminal/terminal_extension_helper.h" |
| 12 #include "chrome/browser/extensions/extension_event_names.h" | 13 #include "chrome/browser/extensions/extension_event_names.h" |
| 13 #include "chrome/browser/extensions/extension_event_router.h" | 14 #include "chrome/browser/extensions/extension_event_router.h" |
| 14 #include "chrome/browser/extensions/extension_service.h" | 15 #include "chrome/browser/extensions/extension_service.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 16 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
| 17 | 18 |
| 18 namespace { | 19 namespace { |
| 19 | 20 |
| 20 const char kCroshName[] = "crosh"; | 21 const char kCroshName[] = "crosh"; |
| 21 const char kCroshCommand[] = "/usr/bin/crosh"; | 22 const char kCroshCommand[] = "/usr/bin/crosh"; |
| 22 // We make stubbed crosh just echo back input. | 23 // We make stubbed crosh just echo back input. |
| 23 const char kStubbedCroshCommand[] = "cat"; | 24 const char kStubbedCroshCommand[] = "cat"; |
| 24 | 25 |
| 25 const char kPermissionError[] = | 26 const char kPermissionError[] = |
| 26 "Extension does not have the permission to use this API"; | 27 "Extension does not have the permission to use this API"; |
| 27 | 28 |
| 28 const char* kAllowedExtensionIds[] ={ | |
| 29 "okddffdblfhhnmhodogpojmfkjmhinfp", // test SSH/Crosh Client | |
| 30 "pnhechapfaindjhompbnflcldabbghjo" // HTerm App | |
| 31 }; | |
| 32 | |
| 33 // Allow component and whitelisted extensions. | |
| 34 bool AllowAccessToExtension(Profile* profile, const std::string& extension_id) { | |
| 35 ExtensionService* service = profile->GetExtensionService(); | |
| 36 const Extension* extension = service->GetExtensionById(extension_id, false); | |
| 37 | |
| 38 if (!extension) | |
| 39 return false; | |
| 40 | |
| 41 if (extension->location() == Extension::COMPONENT) | |
| 42 return true; | |
| 43 | |
| 44 for (size_t i = 0; i < arraysize(kAllowedExtensionIds); i++) { | |
| 45 if (extension->id() == kAllowedExtensionIds[i]) | |
| 46 return true; | |
| 47 } | |
| 48 return false; | |
| 49 } | |
| 50 | |
| 51 const char* GetCroshPath() { | 29 const char* GetCroshPath() { |
| 52 if (chromeos::system::runtime_environment::IsRunningOnChromeOS()) | 30 if (chromeos::system::runtime_environment::IsRunningOnChromeOS()) |
| 53 return kCroshCommand; | 31 return kCroshCommand; |
| 54 else | 32 else |
| 55 return kStubbedCroshCommand; | 33 return kStubbedCroshCommand; |
| 56 } | 34 } |
| 57 | 35 |
| 58 const char* GetProcessCommandForName(const std::string& name) { | 36 const char* GetProcessCommandForName(const std::string& name) { |
| 59 if (name == kCroshName) { | 37 if (name == kCroshName) { |
| 60 return GetCroshPath(); | 38 return GetCroshPath(); |
| 61 } else { | 39 } else { |
| 62 return NULL; | 40 return NULL; |
| 63 } | 41 } |
| 64 } | 42 } |
| 65 | 43 |
| 66 void NotifyProcessOutput(Profile* profile, | 44 void NotifyProcessOutput(Profile* profile, |
| 67 const std::string& extension_id, | 45 const std::string& extension_id, |
| 68 pid_t pid, | 46 pid_t pid, |
| 69 const std::string& output_type, | 47 const std::string& output_type, |
| 70 const std::string& output) { | 48 const std::string& output) { |
| 71 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { | 49 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { |
| 72 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, | 50 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| 73 base::Bind(&NotifyProcessOutput, profile, extension_id, | 51 base::Bind(&NotifyProcessOutput, profile, extension_id, |
| 74 pid, output_type, output)); | 52 pid, output_type, output)); |
| 75 return; | 53 return; |
| 76 } | 54 } |
| 77 | 55 |
| 78 CHECK(AllowAccessToExtension(profile, extension_id)); | 56 CHECK(TerminalExtensionHelper::AllowAccessToExtension(profile, extension_id)); |
| 79 | 57 |
| 80 base::ListValue args; | 58 base::ListValue args; |
| 81 args.Append(new base::FundamentalValue(pid)); | 59 args.Append(new base::FundamentalValue(pid)); |
| 82 args.Append(new base::StringValue(output_type)); | 60 args.Append(new base::StringValue(output_type)); |
| 83 args.Append(new base::StringValue(output)); | 61 args.Append(new base::StringValue(output)); |
| 84 | 62 |
| 85 std::string args_json; | 63 std::string args_json; |
| 86 base::JSONWriter::Write(&args, false /* pretty_print */, &args_json); | 64 base::JSONWriter::Write(&args, false /* pretty_print */, &args_json); |
| 87 | 65 |
| 88 if (profile && profile->GetExtensionEventRouter()) { | 66 if (profile && profile->GetExtensionEventRouter()) { |
| 89 profile->GetExtensionEventRouter()->DispatchEventToExtension( | 67 profile->GetExtensionEventRouter()->DispatchEventToExtension( |
| 90 extension_id, extension_event_names::kOnTerminalProcessOutput, | 68 extension_id, extension_event_names::kOnTerminalProcessOutput, |
| 91 args_json, NULL, GURL()); | 69 args_json, NULL, GURL()); |
| 92 } | 70 } |
| 93 } | 71 } |
| 94 | 72 |
| 95 } // namespace | 73 } // namespace |
| 96 | 74 |
| 97 TerminalPrivateFunction::TerminalPrivateFunction() { | 75 TerminalPrivateFunction::TerminalPrivateFunction() { |
| 98 } | 76 } |
| 99 | 77 |
| 100 TerminalPrivateFunction::~TerminalPrivateFunction() { | 78 TerminalPrivateFunction::~TerminalPrivateFunction() { |
| 101 } | 79 } |
| 102 | 80 |
| 103 bool TerminalPrivateFunction::RunImpl() { | 81 bool TerminalPrivateFunction::RunImpl() { |
| 104 if (!AllowAccessToExtension(profile_, extension_id())) { | 82 if (!TerminalExtensionHelper::AllowAccessToExtension(profile_, |
| 83 extension_id())) { |
| 105 error_ = kPermissionError; | 84 error_ = kPermissionError; |
| 106 return false; | 85 return false; |
| 107 } | 86 } |
| 108 | 87 |
| 109 return RunTerminalFunction(); | 88 return RunTerminalFunction(); |
| 110 } | 89 } |
| 111 | 90 |
| 112 OpenTerminalProcessFunction::OpenTerminalProcessFunction() : command_(NULL) { | 91 OpenTerminalProcessFunction::OpenTerminalProcessFunction() : command_(NULL) { |
| 113 } | 92 } |
| 114 | 93 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 | 183 |
| 205 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, | 184 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| 206 base::Bind(&CloseTerminalProcessFunction::RespondOnUIThread, this, | 185 base::Bind(&CloseTerminalProcessFunction::RespondOnUIThread, this, |
| 207 success)); | 186 success)); |
| 208 } | 187 } |
| 209 | 188 |
| 210 void CloseTerminalProcessFunction::RespondOnUIThread(bool success) { | 189 void CloseTerminalProcessFunction::RespondOnUIThread(bool success) { |
| 211 result_.reset(new base::FundamentalValue(success)); | 190 result_.reset(new base::FundamentalValue(success)); |
| 212 SendResponse(true); | 191 SendResponse(true); |
| 213 } | 192 } |
| OLD | NEW |