summaryrefslogtreecommitdiffstats
path: root/remoting/host/heartbeat_sender.cc
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 23:04:05 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 23:04:05 +0000
commitcdf8c57cbf1d997346e650fb5d0b301f7abc4dd4 (patch)
tree81a7bfd30b29dfaea9cd2644daf06f39d11b17a0 /remoting/host/heartbeat_sender.cc
parentc0035fff490b71ff952b97b6a3d22b1041689979 (diff)
downloadchromium_src-cdf8c57cbf1d997346e650fb5d0b301f7abc4dd4.zip
chromium_src-cdf8c57cbf1d997346e650fb5d0b301f7abc4dd4.tar.gz
chromium_src-cdf8c57cbf1d997346e650fb5d0b301f7abc4dd4.tar.bz2
Added HostKeyPair class, signatures for heartbeat messages.
BUG=None TEST=unittests Review URL: http://codereview.chromium.org/3087003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54991 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host/heartbeat_sender.cc')
-rw-r--r--remoting/host/heartbeat_sender.cc107
1 files changed, 82 insertions, 25 deletions
diff --git a/remoting/host/heartbeat_sender.cc b/remoting/host/heartbeat_sender.cc
index fa234e3..b62b268a 100644
--- a/remoting/host/heartbeat_sender.cc
+++ b/remoting/host/heartbeat_sender.cc
@@ -6,70 +6,103 @@
#include "base/logging.h"
#include "base/message_loop.h"
+#include "base/string_number_conversions.h"
+#include "base/time.h"
#include "remoting/base/constants.h"
#include "remoting/host/host_config.h"
#include "remoting/jingle_glue/iq_request.h"
#include "remoting/jingle_glue/jingle_client.h"
#include "remoting/jingle_glue/jingle_thread.h"
-#include "talk/xmpp/constants.h"
-#include "talk/xmllite/xmlelement.h"
+#include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
+#include "third_party/libjingle/source/talk/xmpp/constants.h"
namespace remoting {
namespace {
-const char * const kChromotingNamespace = "google:remoting";
-const buzz::QName kHeartbeatQuery(true, kChromotingNamespace, "heartbeat");
-const buzz::QName kHostIdAttr(true, kChromotingNamespace, "hostid");
+const char kHeartbeatQueryTag[] = "heartbeat";
+const char kHostIdAttr[] = "hostid";
+const char kHeartbeatSignatureTag[] = "signature";
+const char kSignatureTimeAttr[] = "time";
// TODO(sergeyu): Make this configurable by the cloud.
const int64 kHeartbeatPeriodMs = 5 * 60 * 1000; // 5 minutes.
}
HeartbeatSender::HeartbeatSender()
- : started_(false) {
+ : state_(CREATED) {
}
-void HeartbeatSender::Start(MutableHostConfig* config, JingleClient* jingle_client) {
- DCHECK(jingle_client);
- DCHECK(!started_);
+HeartbeatSender::~HeartbeatSender() {
+ DCHECK(state_ == CREATED || state_ == INITIALIZED || state_ == STOPPED);
+}
- started_ = true;
+bool HeartbeatSender::Init(MutableHostConfig* config,
+ JingleClient* jingle_client) {
+ DCHECK(jingle_client);
+ DCHECK(state_ == CREATED);
jingle_client_ = jingle_client;
config_ = config;
if (!config_->GetString(kHostIdConfigPath, &host_id_)) {
LOG(ERROR) << "host_id is not defined in the config.";
- return;
+ return false;
}
- jingle_client_->message_loop()->PostTask(
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoStart));
+ if (!key_pair_.Load(config)) {
+ return false;
+ }
+
+ state_ = INITIALIZED;
+
+ return true;
}
-void HeartbeatSender::DoStart() {
- DCHECK(MessageLoop::current() == jingle_client_->message_loop());
+void HeartbeatSender::Start() {
+ if (MessageLoop::current() != jingle_client_->message_loop()) {
+ jingle_client_->message_loop()->PostTask(
+ FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::Start));
+ return;
+ }
+
+ DCHECK(state_ == INITIALIZED);
+ state_ = STARTED;
- request_.reset(new IqRequest(jingle_client_));
+ request_.reset(jingle_client_->CreateIqRequest());
request_->set_callback(NewCallback(this, &HeartbeatSender::ProcessResponse));
jingle_client_->message_loop()->PostTask(
FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoSendStanza));
}
+void HeartbeatSender::Stop() {
+ if (MessageLoop::current() != jingle_client_->message_loop()) {
+ jingle_client_->message_loop()->PostTask(
+ FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::Stop));
+ return;
+ }
+
+ DCHECK(state_ == STARTED);
+ state_ = STOPPED;
+ request_.reset(NULL);
+}
+
void HeartbeatSender::DoSendStanza() {
- DCHECK(MessageLoop::current() == jingle_client_->message_loop());
+ if (state_ == STARTED) {
+ // |jingle_client_| may be already destroyed if |state_| is set to
+ // |STOPPED|, so don't touch it here unless we are in |STARTED| state.
+ DCHECK(MessageLoop::current() == jingle_client_->message_loop());
- LOG(INFO) << "Sending heartbeat stanza to " << kChromotingBotJid;
+ LOG(INFO) << "Sending heartbeat stanza to " << kChromotingBotJid;
- buzz::XmlElement* stanza = new buzz::XmlElement(kHeartbeatQuery);
- stanza->AddAttr(kHostIdAttr, host_id_);
- request_->SendIq(buzz::STR_SET, kChromotingBotJid, stanza);
+ request_->SendIq(buzz::STR_SET, kChromotingBotJid,
+ CreateHeartbeatMessage());
- // Schedule next heartbeat.
- jingle_client_->message_loop()->PostDelayedTask(
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoSendStanza),
- kHeartbeatPeriodMs);
+ // Schedule next heartbeat.
+ jingle_client_->message_loop()->PostDelayedTask(
+ FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoSendStanza),
+ kHeartbeatPeriodMs);
+ }
}
void HeartbeatSender::ProcessResponse(const buzz::XmlElement* response) {
@@ -79,4 +112,28 @@ void HeartbeatSender::ProcessResponse(const buzz::XmlElement* response) {
}
}
+buzz::XmlElement* HeartbeatSender::CreateHeartbeatMessage() {
+ buzz::XmlElement* query = new buzz::XmlElement(
+ buzz::QName(kChromotingXmlNamespace, kHeartbeatQueryTag));
+ query->AddAttr(buzz::QName(kChromotingXmlNamespace, kHostIdAttr), host_id_);
+ query->AddElement(CreateSignature());
+ return query;
+}
+
+buzz::XmlElement* HeartbeatSender::CreateSignature() {
+ buzz::XmlElement* signature_tag = new buzz::XmlElement(
+ buzz::QName(kChromotingXmlNamespace, kHeartbeatSignatureTag));
+
+ int64 time = static_cast<int64>(base::Time::Now().ToDoubleT());
+ std::string time_str(base::Int64ToString(time));
+ signature_tag->AddAttr(
+ buzz::QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str);
+
+ std::string message = jingle_client_->GetFullJid() + ' ' + time_str;
+ std::string signature(key_pair_.GetSignature(message));
+ signature_tag->AddText(signature);
+
+ return signature_tag;
+}
+
} // namespace remoting