diff options
Diffstat (limited to 'remoting/host/host_status_sender.h')
-rw-r--r-- | remoting/host/host_status_sender.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/remoting/host/host_status_sender.h b/remoting/host/host_status_sender.h new file mode 100644 index 0000000..3fa86b5 --- /dev/null +++ b/remoting/host/host_status_sender.h @@ -0,0 +1,105 @@ +// Copyright 2013 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. + +#ifndef REMOTING_HOST_STATUS_SENDER_H_ +#define REMOTING_HOST_STATUS_SENDER_H_ + +#include <string> + +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "remoting/base/rsa_key_pair.h" +#include "remoting/host/host_exit_codes.h" +#include "remoting/jingle_glue/signal_strategy.h" + +namespace base { +class MessageLoopProxy; +} // namespace base + +namespace buzz { +class XmlElement; +} // namespace buzz + +namespace remoting { + +class RsaKeyPair; +class IqSender; + +// HostStatusSender sends the host status to the Chromoting Bot. +// Each host status stanza looks as follows: +// +// <cli:iq type="set" to="user@gmail.com/chromoting123123" +// id="123" xmlns:cli="jabber:client"> +// <rem:host-status rem:hostid="0" +// rem:status="OFFLINE" rem:exit-code="INVALID_HOST_CONFIGURATION" +// xmlns:rem="google:remoting"> +// <rem:signature rem:time="1372878097">.signature.</rem:signature> +// <rem:host-version>30.0.1554.0</rem:host-version> +// <rem:log><rem:entry cpu="x86_64" event-name="host-status" +// host-version="30.0.1560.0" os-name="Linux" role="host"/> +// </rem:log> +// </rem:host-status> +// </cli:iq> +// +// The signature is a base-64 encoded SHA-1 hash, signed with the host's +// private RSA key. The message being signed contains the full Jid (e.g. +// "user@gmail.com/chromoting123123"), the timestamp, the host status, +// and the exit code. +class HostStatusSender : SignalStrategy::Listener { + public: + + enum HostStatus { + OFFLINE = 0, + ONLINE = 1 + }; + + HostStatusSender(const std::string& host_id, + SignalStrategy* signal_strategy, + scoped_refptr<RsaKeyPair> key_pair, + const std::string& directory_bot_jid); + virtual ~HostStatusSender(); + + // SignalStrategy::Listener interface. + virtual void OnSignalStrategyStateChange( + SignalStrategy::State state) OVERRIDE; + virtual bool OnSignalStrategyIncomingStanza( + const buzz::XmlElement* stanza) OVERRIDE; + + // APIs for sending host status XMPP messages to the chromoting bot. + // status: the reason (exit code) why the host is offline. + void SendOnlineStatus(); + void SendOfflineStatus(HostExitCodes exit_code); + + inline static const char* HostStatusToString(HostStatus host_status) { + return host_status_strings_[host_status]; + } + + private: + // Helper method for sending either an online or an offline status message. + void SendHostStatus(HostStatus status, HostExitCodes exit_code); + + // Helper method to compose host status stanzas. + scoped_ptr<buzz::XmlElement> CreateHostStatusMessage( + HostStatus status, HostExitCodes exit_code); + + // Helper method to create the signature blob used in the host status stanza. + scoped_ptr<buzz::XmlElement> CreateSignature( + HostStatus status, HostExitCodes exit_code); + + std::string host_id_; + SignalStrategy* signal_strategy_; + scoped_refptr<RsaKeyPair> key_pair_; + std::string directory_bot_jid_; + scoped_ptr<IqSender> iq_sender_; + + // The string representation of the HostStatus values. + static const char* const host_status_strings_[2]; + + DISALLOW_COPY_AND_ASSIGN(HostStatusSender); +}; + +} // namespace remoting + +#endif // REMOTING_HOST_STATUS_SENDER_H_ |