Home | History | Annotate | Download | only in host
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef REMOTING_HOST_STATUS_SENDER_H_
      6 #define REMOTING_HOST_STATUS_SENDER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "remoting/base/rsa_key_pair.h"
     14 #include "remoting/host/host_exit_codes.h"
     15 #include "remoting/jingle_glue/signal_strategy.h"
     16 
     17 namespace base {
     18 class MessageLoopProxy;
     19 }  // namespace base
     20 
     21 namespace buzz {
     22 class XmlElement;
     23 }  // namespace buzz
     24 
     25 namespace remoting {
     26 
     27 class RsaKeyPair;
     28 class IqSender;
     29 
     30 // HostStatusSender sends the host status to the Chromoting Bot.
     31 // Each host status stanza looks as follows:
     32 //
     33 // <cli:iq type="set" to="user (at) gmail.com/chromoting123123"
     34 //     id="123" xmlns:cli="jabber:client">
     35 //   <rem:host-status rem:hostid="0"
     36 //       rem:status="OFFLINE" rem:exit-code="INVALID_HOST_CONFIGURATION"
     37 //       xmlns:rem="google:remoting">
     38 //     <rem:signature rem:time="1372878097">.signature.</rem:signature>
     39 //     <rem:host-version>30.0.1554.0</rem:host-version>
     40 //     <rem:log><rem:entry cpu="x86_64" event-name="host-status"
     41 //         host-version="30.0.1560.0" os-name="Linux" role="host"/>
     42 //     </rem:log>
     43 //   </rem:host-status>
     44 // </cli:iq>
     45 //
     46 // The signature is a base-64 encoded SHA-1 hash, signed with the host's
     47 // private RSA key. The message being signed contains the full Jid (e.g.
     48 // "user (at) gmail.com/chromoting123123"), the timestamp, the host status,
     49 // and the exit code.
     50 class HostStatusSender : SignalStrategy::Listener {
     51  public:
     52 
     53   enum HostStatus {
     54     OFFLINE = 0,
     55     ONLINE = 1
     56   };
     57 
     58   HostStatusSender(const std::string& host_id,
     59                    SignalStrategy* signal_strategy,
     60                    scoped_refptr<RsaKeyPair> key_pair,
     61                    const std::string& directory_bot_jid);
     62   virtual ~HostStatusSender();
     63 
     64   // SignalStrategy::Listener interface.
     65   virtual void OnSignalStrategyStateChange(
     66       SignalStrategy::State state) OVERRIDE;
     67   virtual bool OnSignalStrategyIncomingStanza(
     68       const buzz::XmlElement* stanza) OVERRIDE;
     69 
     70   // APIs for sending host status XMPP messages to the chromoting bot.
     71   // status: the reason (exit code) why the host is offline.
     72   void SendOnlineStatus();
     73   void SendOfflineStatus(HostExitCodes exit_code);
     74 
     75   inline static const char* HostStatusToString(HostStatus host_status) {
     76     return host_status_strings_[host_status];
     77   }
     78 
     79  private:
     80   // Helper method for sending either an online or an offline status message.
     81   void SendHostStatus(HostStatus status, HostExitCodes exit_code);
     82 
     83   // Helper method to compose host status stanzas.
     84   scoped_ptr<buzz::XmlElement> CreateHostStatusMessage(
     85       HostStatus status, HostExitCodes exit_code);
     86 
     87   // Helper method to create the signature blob used in the host status stanza.
     88   scoped_ptr<buzz::XmlElement> CreateSignature(
     89       HostStatus status, HostExitCodes exit_code);
     90 
     91   std::string host_id_;
     92   SignalStrategy* signal_strategy_;
     93   scoped_refptr<RsaKeyPair> key_pair_;
     94   std::string directory_bot_jid_;
     95   scoped_ptr<IqSender> iq_sender_;
     96 
     97   // The string representation of the HostStatus values.
     98   static const char* const host_status_strings_[2];
     99 
    100   DISALLOW_COPY_AND_ASSIGN(HostStatusSender);
    101 };
    102 
    103 }  // namespace remoting
    104 
    105 #endif  // REMOTING_HOST_STATUS_SENDER_H_
    106