From 5815fa01f753fb8efe7e569349d8a053519b0da5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Fri, 16 Oct 2015 17:13:18 -0400
Subject: [PATCH] dht: fix backward compatibility

Pack "token" as ARRAY, as it was with msgpack 1.0,
instead of BIN.
---
 src/dht.cpp | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/dht.cpp b/src/dht.cpp
index d6b057e3..989a4ac0 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -2795,6 +2795,14 @@ Dht::sendFindNode(const sockaddr *sa, socklen_t salen, TransId tid,
     return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen);
 }
 
+void
+packToken(msgpack::packer<msgpack::sbuffer>& pk, Blob token)
+{
+    pk.pack_array(token.size());
+    for (uint8_t b : token)
+        pk.pack(b);
+}
+
 int
 Dht::sendNodesValues(const sockaddr *sa, socklen_t salen, TransId tid,
                  const uint8_t *nodes, unsigned nodes_len,
@@ -2820,7 +2828,7 @@ Dht::sendNodesValues(const sockaddr *sa, socklen_t salen, TransId tid,
         pk.pack_bin_body((const char*)nodes6, nodes6_len);
     }
     if (not token.empty()) {
-        pk.pack(std::string("token")); pk.pack(token);
+        pk.pack(std::string("token")); packToken(pk, token);
     }
     if (not st.empty()) {
         // We treat the storage as a circular list, and serve a randomly
@@ -2989,7 +2997,7 @@ Dht::sendListen(const sockaddr* sa, socklen_t salen, TransId tid,
     pk.pack(std::string("a")); pk.pack_map(3);
       pk.pack(std::string("id"));    pk.pack(myid);
       pk.pack(std::string("h"));     pk.pack(infohash);
-      pk.pack(std::string("token")); pk.pack(token);
+      pk.pack(std::string("token")); packToken(pk, token);
 
     pk.pack(std::string("q")); pk.pack(std::string("listen"));
     pk.pack(std::string("t")); pk.pack_bin(tid.size());
@@ -3034,7 +3042,7 @@ Dht::sendAnnounceValue(const sockaddr *sa, socklen_t salen, TransId tid,
       pk.pack(std::string("id"));     pk.pack(myid);
       pk.pack(std::string("h"));      pk.pack(infohash);
       pk.pack(std::string("values")); pk.pack_array(1); pk.pack(value);
-      pk.pack(std::string("token"));  pk.pack(token);
+      pk.pack(std::string("token"));  packToken(pk, token);
 
     pk.pack(std::string("q")); pk.pack(std::string("put"));
     pk.pack(std::string("t")); pk.pack_bin(tid.size());
-- 
GitLab