Index: remoting/host/plugin/host_script_object.cc |
diff --git a/remoting/host/plugin/host_script_object.cc b/remoting/host/plugin/host_script_object.cc |
deleted file mode 100644 |
index 6acb7362a5a8f10a9ad200beed928294204542b4..0000000000000000000000000000000000000000 |
--- a/remoting/host/plugin/host_script_object.cc |
+++ /dev/null |
@@ -1,1143 +0,0 @@ |
-// 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. |
- |
-#include "remoting/host/plugin/host_script_object.h" |
- |
-#include "base/bind.h" |
-#include "base/json/json_reader.h" |
-#include "base/json/json_writer.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "remoting/base/auth_token_util.h" |
-#include "remoting/base/auto_thread.h" |
-#include "remoting/base/logging.h" |
-#include "remoting/base/resources.h" |
-#include "remoting/base/rsa_key_pair.h" |
-#include "remoting/host/chromoting_host_context.h" |
-#include "remoting/host/host_config.h" |
-#include "remoting/host/pairing_registry_delegate.h" |
-#include "remoting/host/pin_hash.h" |
-#include "remoting/host/plugin/host_log_handler.h" |
-#include "remoting/host/policy_hack/policy_watcher.h" |
-#include "remoting/host/service_urls.h" |
-#include "third_party/npapi/bindings/npapi.h" |
-#include "third_party/npapi/bindings/npfunctions.h" |
-#include "third_party/npapi/bindings/npruntime.h" |
- |
-namespace remoting { |
- |
-namespace { |
- |
-const char* kAttrNameAccessCode = "accessCode"; |
-const char* kAttrNameAccessCodeLifetime = "accessCodeLifetime"; |
-const char* kAttrNameClient = "client"; |
-const char* kAttrNameDaemonState = "daemonState"; |
-const char* kAttrNameState = "state"; |
-const char* kAttrNameLogDebugInfo = "logDebugInfo"; |
-const char* kAttrNameOnNatTraversalPolicyChanged = |
- "onNatTraversalPolicyChanged"; |
-const char* kAttrNameOnStateChanged = "onStateChanged"; |
-const char* kAttrNameXmppServerAddress = "xmppServerAddress"; |
-const char* kAttrNameXmppServerUseTls = "xmppServerUseTls"; |
-const char* kAttrNameDirectoryBotJid = "directoryBotJid"; |
-const char* kAttrNameSupportedFeatures = "supportedFeatures"; |
-const char* kFuncNameConnect = "connect"; |
-const char* kFuncNameDisconnect = "disconnect"; |
-const char* kFuncNameLocalize = "localize"; |
-const char* kFuncNameClearPairedClients = "clearPairedClients"; |
-const char* kFuncNameDeletePairedClient = "deletePairedClient"; |
-const char* kFuncNameGetHostName = "getHostName"; |
-const char* kFuncNameGetPinHash = "getPinHash"; |
-const char* kFuncNameGenerateKeyPair = "generateKeyPair"; |
-const char* kFuncNameUpdateDaemonConfig = "updateDaemonConfig"; |
-const char* kFuncNameGetDaemonConfig = "getDaemonConfig"; |
-const char* kFuncNameGetDaemonVersion = "getDaemonVersion"; |
-const char* kFuncNameGetPairedClients = "getPairedClients"; |
-const char* kFuncNameGetUsageStatsConsent = "getUsageStatsConsent"; |
-const char* kFuncNameInstallHost = "installHost"; |
-const char* kFuncNameStartDaemon = "startDaemon"; |
-const char* kFuncNameStopDaemon = "stopDaemon"; |
- |
-// States. |
-const char* kAttrNameDisconnected = "DISCONNECTED"; |
-const char* kAttrNameStarting = "STARTING"; |
-const char* kAttrNameRequestedAccessCode = "REQUESTED_ACCESS_CODE"; |
-const char* kAttrNameReceivedAccessCode = "RECEIVED_ACCESS_CODE"; |
-const char* kAttrNameConnected = "CONNECTED"; |
-const char* kAttrNameDisconnecting = "DISCONNECTING"; |
-const char* kAttrNameError = "ERROR"; |
-const char* kAttrNameInvalidDomainError = "INVALID_DOMAIN_ERROR"; |
- |
-// Space separated list of features supported in addition to the base protocol. |
-const char* kSupportedFeatures = "pairingRegistry"; |
- |
-} // namespace |
- |
-HostNPScriptObject::HostNPScriptObject( |
- NPP plugin, |
- NPObject* parent, |
- scoped_refptr<AutoThreadTaskRunner> plugin_task_runner) |
- : plugin_(plugin), |
- parent_(parent), |
- plugin_task_runner_(plugin_task_runner), |
- am_currently_logging_(false), |
- state_(kDisconnected), |
- weak_factory_(this) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- weak_ptr_ = weak_factory_.GetWeakPtr(); |
- |
- // Set the thread task runner for the plugin thread so that timers and other |
- // code using |base::ThreadTaskRunnerHandle| could be used on the plugin |
- // thread. |
- // |
- // If component build is used, Chrome and the plugin may end up sharing base |
- // binary. This means that the instance of |base::ThreadTaskRunnerHandle| |
- // created by Chrome for the current thread is shared as well. This routinely |
- // happens in the development setting so the below check for |
- // |!base::ThreadTaskRunnerHandle::IsSet()| is a hack/workaround allowing this |
- // configuration to work. It lets the plugin to access Chrome's message loop |
- // directly via |base::ThreadTaskRunnerHandle|. This is safe as long as both |
- // Chrome and the plugin are built from the same version of the sources. |
- if (!base::ThreadTaskRunnerHandle::IsSet()) { |
- plugin_task_runner_handle_.reset( |
- new base::ThreadTaskRunnerHandle(plugin_task_runner_)); |
- } |
- |
- daemon_controller_ = DaemonController::Create(); |
- |
- ServiceUrls* service_urls = ServiceUrls::GetInstance(); |
- bool xmpp_server_valid = net::ParseHostAndPort( |
- service_urls->xmpp_server_address(), |
- &xmpp_server_config_.host, &xmpp_server_config_.port); |
- // For the plugin, this is always the default address, which must be valid. |
- DCHECK(xmpp_server_valid); |
- xmpp_server_config_.use_tls = service_urls->xmpp_server_use_tls(); |
- directory_bot_jid_ = service_urls->directory_bot_jid(); |
- |
- // Create worker thread for encryption key generation and loading the paired |
- // clients. |
- worker_thread_ = AutoThread::Create("ChromotingWorkerThread", |
- plugin_task_runner_); |
- |
- pairing_registry_ = CreatePairingRegistry(worker_thread_); |
-} |
- |
-HostNPScriptObject::~HostNPScriptObject() { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- HostLogHandler::UnregisterLoggingScriptObject(this); |
- |
- // Stop the It2Me host if the caller forgot to. |
- if (it2me_host_.get()) { |
- it2me_host_->Disconnect(); |
- it2me_host_ = NULL; |
- } |
-} |
- |
-bool HostNPScriptObject::HasMethod(const std::string& method_name) { |
- VLOG(2) << "HasMethod " << method_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- return (method_name == kFuncNameConnect || |
- method_name == kFuncNameDisconnect || |
- method_name == kFuncNameLocalize || |
- method_name == kFuncNameClearPairedClients || |
- method_name == kFuncNameDeletePairedClient || |
- method_name == kFuncNameGetHostName || |
- method_name == kFuncNameGetPinHash || |
- method_name == kFuncNameGenerateKeyPair || |
- method_name == kFuncNameUpdateDaemonConfig || |
- method_name == kFuncNameGetDaemonConfig || |
- method_name == kFuncNameGetDaemonVersion || |
- method_name == kFuncNameGetPairedClients || |
- method_name == kFuncNameGetUsageStatsConsent || |
- method_name == kFuncNameInstallHost || |
- method_name == kFuncNameStartDaemon || |
- method_name == kFuncNameStopDaemon); |
-} |
- |
-bool HostNPScriptObject::InvokeDefault(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- VLOG(2) << "InvokeDefault"; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- SetException("exception during default invocation"); |
- return false; |
-} |
- |
-bool HostNPScriptObject::Invoke(const std::string& method_name, |
- const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- VLOG(2) << "Invoke " << method_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- if (method_name == kFuncNameConnect) { |
- return Connect(args, arg_count, result); |
- } else if (method_name == kFuncNameDisconnect) { |
- return Disconnect(args, arg_count, result); |
- } else if (method_name == kFuncNameLocalize) { |
- return Localize(args, arg_count, result); |
- } else if (method_name == kFuncNameClearPairedClients) { |
- return ClearPairedClients(args, arg_count, result); |
- } else if (method_name == kFuncNameDeletePairedClient) { |
- return DeletePairedClient(args, arg_count, result); |
- } else if (method_name == kFuncNameGetHostName) { |
- return GetHostName(args, arg_count, result); |
- } else if (method_name == kFuncNameGetPinHash) { |
- return GetPinHash(args, arg_count, result); |
- } else if (method_name == kFuncNameGenerateKeyPair) { |
- return GenerateKeyPair(args, arg_count, result); |
- } else if (method_name == kFuncNameUpdateDaemonConfig) { |
- return UpdateDaemonConfig(args, arg_count, result); |
- } else if (method_name == kFuncNameGetDaemonConfig) { |
- return GetDaemonConfig(args, arg_count, result); |
- } else if (method_name == kFuncNameGetDaemonVersion) { |
- return GetDaemonVersion(args, arg_count, result); |
- } else if (method_name == kFuncNameGetPairedClients) { |
- return GetPairedClients(args, arg_count, result); |
- } else if (method_name == kFuncNameGetUsageStatsConsent) { |
- return GetUsageStatsConsent(args, arg_count, result); |
- } else if (method_name == kFuncNameInstallHost) { |
- return InstallHost(args, arg_count, result); |
- } else if (method_name == kFuncNameStartDaemon) { |
- return StartDaemon(args, arg_count, result); |
- } else if (method_name == kFuncNameStopDaemon) { |
- return StopDaemon(args, arg_count, result); |
- } else { |
- SetException("Invoke: unknown method " + method_name); |
- return false; |
- } |
-} |
- |
-bool HostNPScriptObject::HasProperty(const std::string& property_name) { |
- VLOG(2) << "HasProperty " << property_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- return (property_name == kAttrNameAccessCode || |
- property_name == kAttrNameAccessCodeLifetime || |
- property_name == kAttrNameClient || |
- property_name == kAttrNameDaemonState || |
- property_name == kAttrNameState || |
- property_name == kAttrNameLogDebugInfo || |
- property_name == kAttrNameOnNatTraversalPolicyChanged || |
- property_name == kAttrNameOnStateChanged || |
- property_name == kAttrNameDisconnected || |
- property_name == kAttrNameStarting || |
- property_name == kAttrNameRequestedAccessCode || |
- property_name == kAttrNameReceivedAccessCode || |
- property_name == kAttrNameConnected || |
- property_name == kAttrNameDisconnecting || |
- property_name == kAttrNameError || |
- property_name == kAttrNameXmppServerAddress || |
- property_name == kAttrNameXmppServerUseTls || |
- property_name == kAttrNameDirectoryBotJid || |
- property_name == kAttrNameSupportedFeatures); |
-} |
- |
-bool HostNPScriptObject::GetProperty(const std::string& property_name, |
- NPVariant* result) { |
- VLOG(2) << "GetProperty " << property_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- if (!result) { |
- SetException("GetProperty: NULL result"); |
- return false; |
- } |
- |
- if (property_name == kAttrNameOnNatTraversalPolicyChanged) { |
- OBJECT_TO_NPVARIANT(on_nat_traversal_policy_changed_func_.get(), *result); |
- return true; |
- } else if (property_name == kAttrNameOnStateChanged) { |
- OBJECT_TO_NPVARIANT(on_state_changed_func_.get(), *result); |
- return true; |
- } else if (property_name == kAttrNameLogDebugInfo) { |
- OBJECT_TO_NPVARIANT(log_debug_info_func_.get(), *result); |
- return true; |
- } else if (property_name == kAttrNameState) { |
- INT32_TO_NPVARIANT(state_, *result); |
- return true; |
- } else if (property_name == kAttrNameAccessCode) { |
- *result = NPVariantFromString(access_code_); |
- return true; |
- } else if (property_name == kAttrNameAccessCodeLifetime) { |
- INT32_TO_NPVARIANT(access_code_lifetime_.InSeconds(), *result); |
- return true; |
- } else if (property_name == kAttrNameClient) { |
- *result = NPVariantFromString(client_username_); |
- return true; |
- } else if (property_name == kAttrNameDaemonState) { |
- INT32_TO_NPVARIANT(daemon_controller_->GetState(), *result); |
- return true; |
- } else if (property_name == kAttrNameDisconnected) { |
- INT32_TO_NPVARIANT(kDisconnected, *result); |
- return true; |
- } else if (property_name == kAttrNameStarting) { |
- INT32_TO_NPVARIANT(kStarting, *result); |
- return true; |
- } else if (property_name == kAttrNameRequestedAccessCode) { |
- INT32_TO_NPVARIANT(kRequestedAccessCode, *result); |
- return true; |
- } else if (property_name == kAttrNameReceivedAccessCode) { |
- INT32_TO_NPVARIANT(kReceivedAccessCode, *result); |
- return true; |
- } else if (property_name == kAttrNameConnected) { |
- INT32_TO_NPVARIANT(kConnected, *result); |
- return true; |
- } else if (property_name == kAttrNameDisconnecting) { |
- INT32_TO_NPVARIANT(kDisconnecting, *result); |
- return true; |
- } else if (property_name == kAttrNameError) { |
- INT32_TO_NPVARIANT(kError, *result); |
- return true; |
- } else if (property_name == kAttrNameInvalidDomainError) { |
- INT32_TO_NPVARIANT(kInvalidDomainError, *result); |
- return true; |
- } else if (property_name == kAttrNameXmppServerAddress) { |
- *result = NPVariantFromString(base::StringPrintf( |
- "%s:%u", xmpp_server_config_.host.c_str(), xmpp_server_config_.port)); |
- return true; |
- } else if (property_name == kAttrNameXmppServerUseTls) { |
- BOOLEAN_TO_NPVARIANT(xmpp_server_config_.use_tls, *result); |
- return true; |
- } else if (property_name == kAttrNameDirectoryBotJid) { |
- *result = NPVariantFromString(directory_bot_jid_); |
- return true; |
- } else if (property_name == kAttrNameSupportedFeatures) { |
- *result = NPVariantFromString(kSupportedFeatures); |
- return true; |
- } else { |
- SetException("GetProperty: unsupported property " + property_name); |
- return false; |
- } |
-} |
- |
-bool HostNPScriptObject::SetProperty(const std::string& property_name, |
- const NPVariant* value) { |
- VLOG(2) << "SetProperty " << property_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (property_name == kAttrNameOnNatTraversalPolicyChanged) { |
- if (NPVARIANT_IS_OBJECT(*value)) { |
- on_nat_traversal_policy_changed_func_ = NPVARIANT_TO_OBJECT(*value); |
- if (it2me_host_.get()) { |
- // Ask the It2Me host to notify the web-app of the policy. |
- it2me_host_->RequestNatPolicy(); |
- } |
- return true; |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
- |
- if (property_name == kAttrNameOnStateChanged) { |
- if (NPVARIANT_IS_OBJECT(*value)) { |
- on_state_changed_func_ = NPVARIANT_TO_OBJECT(*value); |
- return true; |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
- |
- if (property_name == kAttrNameLogDebugInfo) { |
- if (NPVARIANT_IS_OBJECT(*value)) { |
- log_debug_info_func_ = NPVARIANT_TO_OBJECT(*value); |
- HostLogHandler::RegisterLoggingScriptObject(this); |
- return true; |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
- |
-#if !defined(NDEBUG) |
- if (property_name == kAttrNameXmppServerAddress) { |
- if (NPVARIANT_IS_STRING(*value)) { |
- std::string address = StringFromNPVariant(*value); |
- bool xmpp_server_valid = net::ParseHostAndPort( |
- address, &xmpp_server_config_.host, &xmpp_server_config_.port); |
- if (xmpp_server_valid) { |
- return true; |
- } else { |
- SetException("SetProperty: invalid value for property " + |
- property_name); |
- } |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
- |
- if (property_name == kAttrNameXmppServerUseTls) { |
- if (NPVARIANT_IS_BOOLEAN(*value)) { |
- xmpp_server_config_.use_tls = NPVARIANT_TO_BOOLEAN(*value); |
- return true; |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
- |
- if (property_name == kAttrNameDirectoryBotJid) { |
- if (NPVARIANT_IS_STRING(*value)) { |
- directory_bot_jid_ = StringFromNPVariant(*value); |
- return true; |
- } else { |
- SetException("SetProperty: unexpected type for property " + |
- property_name); |
- } |
- return false; |
- } |
-#endif // !defined(NDEBUG) |
- |
- return false; |
-} |
- |
-bool HostNPScriptObject::RemoveProperty(const std::string& property_name) { |
- VLOG(2) << "RemoveProperty " << property_name; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- return false; |
-} |
- |
-bool HostNPScriptObject::Enumerate(std::vector<std::string>* values) { |
- VLOG(2) << "Enumerate"; |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- const char* entries[] = { |
- kAttrNameAccessCode, |
- kAttrNameState, |
- kAttrNameLogDebugInfo, |
- kAttrNameOnStateChanged, |
- kAttrNameDisconnected, |
- kAttrNameStarting, |
- kAttrNameRequestedAccessCode, |
- kAttrNameReceivedAccessCode, |
- kAttrNameConnected, |
- kAttrNameDisconnecting, |
- kAttrNameError, |
- kAttrNameXmppServerAddress, |
- kAttrNameXmppServerUseTls, |
- kAttrNameDirectoryBotJid, |
- kFuncNameConnect, |
- kFuncNameDisconnect, |
- kFuncNameLocalize, |
- kFuncNameClearPairedClients, |
- kFuncNameDeletePairedClient, |
- kFuncNameGetHostName, |
- kFuncNameGetPinHash, |
- kFuncNameGenerateKeyPair, |
- kFuncNameUpdateDaemonConfig, |
- kFuncNameGetDaemonConfig, |
- kFuncNameGetDaemonVersion, |
- kFuncNameGetPairedClients, |
- kFuncNameGetUsageStatsConsent, |
- kFuncNameInstallHost, |
- kFuncNameStartDaemon, |
- kFuncNameStopDaemon |
- }; |
- for (size_t i = 0; i < arraysize(entries); ++i) { |
- values->push_back(entries[i]); |
- } |
- return true; |
-} |
- |
-// string username, string auth_token |
-bool HostNPScriptObject::Connect(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- HOST_LOG << "Connecting..."; |
- |
- if (arg_count != 2) { |
- SetException("connect: bad number of arguments"); |
- return false; |
- } |
- |
- if (it2me_host_.get()) { |
- SetException("connect: can be called only when disconnected"); |
- return false; |
- } |
- |
- XmppSignalStrategy::XmppServerConfig xmpp_config = xmpp_server_config_; |
- |
- xmpp_config.username = StringFromNPVariant(args[0]); |
- if (xmpp_config.username.empty()) { |
- SetException("connect: bad username argument"); |
- return false; |
- } |
- |
- std::string auth_service_with_token = StringFromNPVariant(args[1]); |
- ParseAuthTokenWithService(auth_service_with_token, &xmpp_config.auth_token, |
- &xmpp_config.auth_service); |
- if (xmpp_config.auth_token.empty()) { |
- SetException("connect: auth_service_with_token argument has empty token"); |
- return false; |
- } |
- |
- // Create a host context to manage the threads for the it2me host. |
- // The plugin, rather than the It2MeHost object, owns and maintains the |
- // lifetime of the host context. |
- host_context_.reset( |
- ChromotingHostContext::Create(plugin_task_runner_).release()); |
- if (!host_context_) { |
- SetException("connect: failed to start threads"); |
- return false; |
- } |
- |
- // Create the It2Me host and start connecting. |
- scoped_ptr<It2MeHostFactory> factory(new It2MeHostFactory()); |
- it2me_host_ = factory->CreateIt2MeHost( |
- host_context_.get(), plugin_task_runner_, weak_ptr_, |
- xmpp_config, directory_bot_jid_); |
- it2me_host_->Connect(); |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::Disconnect(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- if (arg_count != 0) { |
- SetException("disconnect: bad number of arguments"); |
- return false; |
- } |
- |
- if (it2me_host_.get()) { |
- it2me_host_->Disconnect(); |
- it2me_host_ = NULL; |
- } |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::Localize(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- if (arg_count != 1) { |
- SetException("localize: bad number of arguments"); |
- return false; |
- } |
- |
- if (NPVARIANT_IS_OBJECT(args[0])) { |
- ScopedRefNPObject localize_func(NPVARIANT_TO_OBJECT(args[0])); |
- LocalizeStrings(localize_func.get()); |
- return true; |
- } else { |
- SetException("localize: unexpected type for argument 1"); |
- return false; |
- } |
-} |
- |
-bool HostNPScriptObject::ClearPairedClients(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("clearPairedClients: bad number of arguments"); |
- return false; |
- } |
- |
- if (!NPVARIANT_IS_OBJECT(args[0])) { |
- SetException("clearPairedClients: invalid callback parameter"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (pairing_registry_) { |
- pairing_registry_->ClearAllPairings( |
- base::Bind(&HostNPScriptObject::InvokeBooleanCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- } else { |
- InvokeBooleanCallback(callback_obj.Pass(), false); |
- } |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::DeletePairedClient(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 2) { |
- SetException("deletePairedClient: bad number of arguments"); |
- return false; |
- } |
- |
- if (!NPVARIANT_IS_STRING(args[0])) { |
- SetException("deletePairedClient: bad clientId parameter"); |
- return false; |
- } |
- |
- if (!NPVARIANT_IS_OBJECT(args[1])) { |
- SetException("deletePairedClient: invalid callback parameter"); |
- return false; |
- } |
- |
- std::string client_id = StringFromNPVariant(args[0]); |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
- if (pairing_registry_) { |
- pairing_registry_->DeletePairing( |
- client_id, |
- base::Bind(&HostNPScriptObject::InvokeBooleanCallback, |
- weak_ptr_, base::Passed(&callback_obj))); |
- } else { |
- InvokeBooleanCallback(callback_obj.Pass(), false); |
- } |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetHostName(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("getHostName: bad number of arguments"); |
- return false; |
- } |
- |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[0])); |
- if (!callback_obj.get()) { |
- SetException("getHostName: invalid callback parameter"); |
- return false; |
- } |
- |
- NPVariant host_name_val = NPVariantFromString(net::GetHostName()); |
- InvokeAndIgnoreResult(callback_obj, &host_name_val, 1); |
- g_npnetscape_funcs->releasevariantvalue(&host_name_val); |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetPinHash(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 3) { |
- SetException("getPinHash: bad number of arguments"); |
- return false; |
- } |
- |
- std::string host_id = StringFromNPVariant(args[0]); |
- if (host_id.empty()) { |
- SetException("getPinHash: bad hostId parameter"); |
- return false; |
- } |
- |
- if (!NPVARIANT_IS_STRING(args[1])) { |
- SetException("getPinHash: bad pin parameter"); |
- return false; |
- } |
- std::string pin = StringFromNPVariant(args[1]); |
- |
- ScopedRefNPObject callback_obj(ObjectFromNPVariant(args[2])); |
- if (!callback_obj.get()) { |
- SetException("getPinHash: invalid callback parameter"); |
- return false; |
- } |
- |
- NPVariant pin_hash_val = NPVariantFromString( |
- remoting::MakeHostPinHash(host_id, pin)); |
- InvokeAndIgnoreResult(callback_obj, &pin_hash_val, 1); |
- g_npnetscape_funcs->releasevariantvalue(&pin_hash_val); |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::GenerateKeyPair(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("generateKeyPair: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("generateKeyPair: invalid callback parameter"); |
- return false; |
- } |
- |
- base::Callback<void (const std::string&, |
- const std::string&)> wrapped_callback = |
- base::Bind(&HostNPScriptObject::InvokeGenerateKeyPairCallback, weak_ptr_, |
- base::Passed(&callback_obj)); |
- worker_thread_->PostTask( |
- FROM_HERE, base::Bind(&HostNPScriptObject::DoGenerateKeyPair, |
- plugin_task_runner_, wrapped_callback)); |
- return true; |
-} |
- |
-bool HostNPScriptObject::UpdateDaemonConfig(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 2) { |
- SetException("updateDaemonConfig: bad number of arguments"); |
- return false; |
- } |
- |
- std::string config_str = StringFromNPVariant(args[0]); |
- scoped_ptr<base::Value> config( |
- base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); |
- if (config_str.empty() || !config.get() || |
- !config->IsType(base::Value::TYPE_DICTIONARY)) { |
- SetException("updateDaemonConfig: bad config parameter"); |
- return false; |
- } |
- scoped_ptr<base::DictionaryValue> config_dict( |
- reinterpret_cast<base::DictionaryValue*>(config.release())); |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[1]))); |
- if (!callback_obj->get()) { |
- SetException("updateDaemonConfig: invalid callback parameter"); |
- return false; |
- } |
- |
- if (config_dict->HasKey(kHostIdConfigPath) || |
- config_dict->HasKey(kXmppLoginConfigPath)) { |
- SetException("updateDaemonConfig: trying to update immutable config " |
- "parameters"); |
- return false; |
- } |
- |
- daemon_controller_->UpdateConfig( |
- config_dict.Pass(), |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetDaemonConfig(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("getDaemonConfig: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("getDaemonConfig: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->GetConfig( |
- base::Bind(&HostNPScriptObject::InvokeGetDaemonConfigCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetDaemonVersion(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("getDaemonVersion: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("getDaemonVersion: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->GetVersion( |
- base::Bind(&HostNPScriptObject::InvokeGetDaemonVersionCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetPairedClients(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("getPairedClients: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("getPairedClients: invalid callback parameter"); |
- return false; |
- } |
- |
- if (pairing_registry_) { |
- pairing_registry_->GetAllPairings( |
- base::Bind(&HostNPScriptObject::InvokeGetPairedClientsCallback, |
- weak_ptr_, base::Passed(&callback_obj))); |
- } else { |
- scoped_ptr<base::ListValue> no_paired_clients(new base::ListValue); |
- InvokeGetPairedClientsCallback(callback_obj.Pass(), |
- no_paired_clients.Pass()); |
- } |
- return true; |
-} |
- |
-bool HostNPScriptObject::GetUsageStatsConsent(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- if (arg_count != 1) { |
- SetException("getUsageStatsConsent: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("getUsageStatsConsent: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->GetUsageStatsConsent( |
- base::Bind(&HostNPScriptObject::InvokeGetUsageStatsConsentCallback, |
- weak_ptr_, base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-bool HostNPScriptObject::InstallHost(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (arg_count != 1) { |
- SetException("installHost: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("installHost: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->InstallHost( |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-bool HostNPScriptObject::StartDaemon(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (arg_count != 3) { |
- SetException("startDaemon: bad number of arguments"); |
- return false; |
- } |
- |
- std::string config_str = StringFromNPVariant(args[0]); |
- scoped_ptr<base::Value> config( |
- base::JSONReader::Read(config_str, base::JSON_ALLOW_TRAILING_COMMAS)); |
- if (config_str.empty() || !config.get() || |
- !config->IsType(base::Value::TYPE_DICTIONARY)) { |
- SetException("startDaemon: bad config parameter"); |
- return false; |
- } |
- scoped_ptr<base::DictionaryValue> config_dict( |
- reinterpret_cast<base::DictionaryValue*>(config.release())); |
- |
- if (!NPVARIANT_IS_BOOLEAN(args[1])) { |
- SetException("startDaemon: invalid consent parameter"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[2]))); |
- if (!callback_obj->get()) { |
- SetException("startDaemon: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->SetConfigAndStart( |
- config_dict.Pass(), |
- NPVARIANT_TO_BOOLEAN(args[1]), |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-bool HostNPScriptObject::StopDaemon(const NPVariant* args, |
- uint32_t arg_count, |
- NPVariant* result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (arg_count != 1) { |
- SetException("stopDaemon: bad number of arguments"); |
- return false; |
- } |
- |
- scoped_ptr<ScopedRefNPObject> callback_obj( |
- new ScopedRefNPObject(ObjectFromNPVariant(args[0]))); |
- if (!callback_obj->get()) { |
- SetException("stopDaemon: invalid callback parameter"); |
- return false; |
- } |
- |
- daemon_controller_->Stop( |
- base::Bind(&HostNPScriptObject::InvokeAsyncResultCallback, weak_ptr_, |
- base::Passed(&callback_obj))); |
- return true; |
-} |
- |
-void HostNPScriptObject::OnStateChanged(It2MeHostState state) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- state_ = state; |
- |
- if (state_ == kDisconnected) |
- client_username_.clear(); |
- |
- if (on_state_changed_func_.get()) { |
- NPVariant state_var; |
- INT32_TO_NPVARIANT(state, state_var); |
- InvokeAndIgnoreResult(on_state_changed_func_, &state_var, 1); |
- } |
-} |
- |
-void HostNPScriptObject::OnNatPolicyChanged(bool nat_traversal_enabled) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (on_nat_traversal_policy_changed_func_.get()) { |
- NPVariant policy; |
- BOOLEAN_TO_NPVARIANT(nat_traversal_enabled, policy); |
- InvokeAndIgnoreResult(on_nat_traversal_policy_changed_func_, |
- &policy, 1); |
- } |
-} |
- |
-// Stores the Access Code for the web-app to query. |
-void HostNPScriptObject::OnStoreAccessCode( |
- const std::string& access_code, base::TimeDelta access_code_lifetime) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- access_code_ = access_code; |
- access_code_lifetime_ = access_code_lifetime; |
-} |
- |
-// Stores the client user's name for the web-app to query. |
-void HostNPScriptObject::OnClientAuthenticated( |
- const std::string& client_username) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- client_username_ = client_username; |
-} |
- |
-void HostNPScriptObject::PostLogDebugInfo(const std::string& message) { |
- if (plugin_task_runner_->BelongsToCurrentThread()) { |
- // Make sure we're not currently processing a log message. |
- // We only need to check this if we're on the plugin thread. |
- if (am_currently_logging_) |
- return; |
- } |
- |
- // Always post (even if we're already on the correct thread) so that debug |
- // log messages are shown in the correct order. |
- plugin_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&HostNPScriptObject::LogDebugInfo, |
- weak_ptr_, message)); |
-} |
- |
-void HostNPScriptObject::SetWindow(NPWindow* np_window) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- daemon_controller_->SetWindow(np_window->window); |
-} |
- |
-void HostNPScriptObject::LocalizeStrings(NPObject* localize_func) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- // Reload resources for the current locale. The default UI locale is used on |
- // Windows. |
-#if !defined(OS_WIN) |
- base::string16 ui_locale; |
- LocalizeString(localize_func, "@@ui_locale", &ui_locale); |
- remoting::LoadResources(base::UTF16ToUTF8(ui_locale)); |
-#endif // !defined(OS_WIN) |
-} |
- |
-bool HostNPScriptObject::LocalizeString(NPObject* localize_func, |
- const char* tag, |
- base::string16* result) { |
- return LocalizeStringWithSubstitution(localize_func, tag, NULL, result); |
-} |
- |
-bool HostNPScriptObject::LocalizeStringWithSubstitution( |
- NPObject* localize_func, |
- const char* tag, |
- const char* substitution, |
- base::string16* result) { |
- int argc = substitution ? 2 : 1; |
- scoped_ptr<NPVariant[]> args(new NPVariant[argc]); |
- STRINGZ_TO_NPVARIANT(tag, args[0]); |
- if (substitution) { |
- STRINGZ_TO_NPVARIANT(substitution, args[1]); |
- } |
- NPVariant np_result; |
- bool is_good = g_npnetscape_funcs->invokeDefault( |
- plugin_, localize_func, args.get(), argc, &np_result); |
- if (!is_good) { |
- LOG(ERROR) << "Localization failed for " << tag; |
- return false; |
- } |
- std::string translation = StringFromNPVariant(np_result); |
- g_npnetscape_funcs->releasevariantvalue(&np_result); |
- if (translation.empty()) { |
- LOG(ERROR) << "Missing translation for " << tag; |
- return false; |
- } |
- *result = base::UTF8ToUTF16(translation); |
- return true; |
-} |
- |
-// static |
-void HostNPScriptObject::DoGenerateKeyPair( |
- const scoped_refptr<AutoThreadTaskRunner>& plugin_task_runner, |
- const base::Callback<void (const std::string&, |
- const std::string&)>& callback) { |
- scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); |
- plugin_task_runner->PostTask(FROM_HERE, |
- base::Bind(callback, key_pair->ToString(), |
- key_pair->GetPublicKey())); |
-} |
- |
-void HostNPScriptObject::InvokeGenerateKeyPairCallback( |
- scoped_ptr<ScopedRefNPObject> callback, |
- const std::string& private_key, |
- const std::string& public_key) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant params[2]; |
- params[0] = NPVariantFromString(private_key); |
- params[1] = NPVariantFromString(public_key); |
- InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
- g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
- g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
-} |
- |
-void HostNPScriptObject::InvokeAsyncResultCallback( |
- scoped_ptr<ScopedRefNPObject> callback, |
- DaemonController::AsyncResult result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant result_var; |
- INT32_TO_NPVARIANT(static_cast<int32>(result), result_var); |
- InvokeAndIgnoreResult(*callback, &result_var, 1); |
- g_npnetscape_funcs->releasevariantvalue(&result_var); |
-} |
- |
-void HostNPScriptObject::InvokeBooleanCallback( |
- scoped_ptr<ScopedRefNPObject> callback, bool result) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant result_var; |
- BOOLEAN_TO_NPVARIANT(result, result_var); |
- InvokeAndIgnoreResult(*callback, &result_var, 1); |
- g_npnetscape_funcs->releasevariantvalue(&result_var); |
-} |
- |
-void HostNPScriptObject::InvokeGetDaemonConfigCallback( |
- scoped_ptr<ScopedRefNPObject> callback, |
- scoped_ptr<base::DictionaryValue> config) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- // There is no easy way to create a dictionary from an NPAPI plugin |
- // so we have to serialize the dictionary to pass it to JavaScript. |
- std::string config_str; |
- if (config.get()) |
- base::JSONWriter::Write(config.get(), &config_str); |
- |
- NPVariant config_val = NPVariantFromString(config_str); |
- InvokeAndIgnoreResult(*callback, &config_val, 1); |
- g_npnetscape_funcs->releasevariantvalue(&config_val); |
-} |
- |
-void HostNPScriptObject::InvokeGetDaemonVersionCallback( |
- scoped_ptr<ScopedRefNPObject> callback, const std::string& version) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant version_val = NPVariantFromString(version); |
- InvokeAndIgnoreResult(*callback, &version_val, 1); |
- g_npnetscape_funcs->releasevariantvalue(&version_val); |
-} |
- |
-void HostNPScriptObject::InvokeGetPairedClientsCallback( |
- scoped_ptr<ScopedRefNPObject> callback, |
- scoped_ptr<base::ListValue> paired_clients) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- std::string paired_clients_json; |
- base::JSONWriter::Write(paired_clients.get(), &paired_clients_json); |
- |
- NPVariant paired_clients_val = NPVariantFromString(paired_clients_json); |
- InvokeAndIgnoreResult(*callback, &paired_clients_val, 1); |
- g_npnetscape_funcs->releasevariantvalue(&paired_clients_val); |
-} |
- |
-void HostNPScriptObject::InvokeGetUsageStatsConsentCallback( |
- scoped_ptr<ScopedRefNPObject> callback, |
- const DaemonController::UsageStatsConsent& consent) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant params[3]; |
- BOOLEAN_TO_NPVARIANT(consent.supported, params[0]); |
- BOOLEAN_TO_NPVARIANT(consent.allowed, params[1]); |
- BOOLEAN_TO_NPVARIANT(consent.set_by_policy, params[2]); |
- InvokeAndIgnoreResult(*callback, params, arraysize(params)); |
- g_npnetscape_funcs->releasevariantvalue(&(params[0])); |
- g_npnetscape_funcs->releasevariantvalue(&(params[1])); |
- g_npnetscape_funcs->releasevariantvalue(&(params[2])); |
-} |
- |
-void HostNPScriptObject::LogDebugInfo(const std::string& message) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- if (log_debug_info_func_.get()) { |
- am_currently_logging_ = true; |
- NPVariant log_message; |
- STRINGZ_TO_NPVARIANT(message.c_str(), log_message); |
- bool is_good = InvokeAndIgnoreResult(log_debug_info_func_, |
- &log_message, 1); |
- if (!is_good) { |
- LOG(ERROR) << "ERROR - LogDebugInfo failed\n"; |
- } |
- am_currently_logging_ = false; |
- } |
-} |
- |
-bool HostNPScriptObject::InvokeAndIgnoreResult(const ScopedRefNPObject& func, |
- const NPVariant* args, |
- uint32_t arg_count) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- NPVariant np_result; |
- bool is_good = g_npnetscape_funcs->invokeDefault(plugin_, func.get(), args, |
- arg_count, &np_result); |
- if (is_good) |
- g_npnetscape_funcs->releasevariantvalue(&np_result); |
- |
- return is_good; |
-} |
- |
-void HostNPScriptObject::SetException(const std::string& exception_string) { |
- DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
- |
- g_npnetscape_funcs->setexception(parent_, exception_string.c_str()); |
- HOST_LOG << exception_string; |
-} |
- |
-} // namespace remoting |