33class OPENDHT_PUBLIC
SecureDht final :
public DhtInterface {
36 typedef std::function<void(
bool)> SignatureCheckCallback;
40 static dht::Config getConfig(
const SecureDht::Config& conf)
42 auto c = conf.node_config;
43 if (not c.node_id and conf.id.second)
44 c.
node_id = InfoHash::get(
"node:"+conf.id.second->getId().toString());
54 SecureDht(std::unique_ptr<DhtInterface>
dht, Config config, IdentityAnnouncedCb iacb = {},
const std::shared_ptr<Logger>& l = {});
58 InfoHash getId()
const {
59 return key_ ? key_->getPublicKey().getId() : InfoHash();
61 PkId getLongId()
const {
62 return key_ ? key_->getPublicKey().getLongId() : PkId();
64 Sp<crypto::PublicKey> getPublicKey()
const {
65 return key_ ? key_->getSharedPublicKey() : Sp<crypto::PublicKey>{};
68 ValueType secureType(ValueType&& type);
70 ValueType secureType(
const ValueType& type) {
71 ValueType tmp_type = type;
72 return secureType(std::move(tmp_type));
75 void registerType(
const ValueType& type)
override {
77 dht_->registerType(secureType(type));
79 void registerType(ValueType&& type) {
81 dht_->registerType(secureType(std::forward<ValueType>(type)));
83 void registerInsecureType(
const ValueType& type) {
85 dht_->registerType(type);
93 void get(
const InfoHash&
id, GetCallback cb, DoneCallback donecb={},
Value::Filter&& = {}, Where&& w = {})
override;
94 void get(
const InfoHash&
id, GetCallback cb, DoneCallbackSimple donecb={}, Value::Filter&& f = {}, Where&& w = {})
override {
95 get(
id, cb, bindDoneCb(donecb), std::forward<Value::Filter>(f), std::forward<Where>(w));
97 void get(
const InfoHash& key, GetCallbackSimple cb, DoneCallback donecb={}, Value::Filter&& f={}, Where&& w = {})
override {
98 get(key, bindGetCb(cb), donecb, std::forward<Value::Filter>(f), std::forward<Where>(w));
100 void get(
const InfoHash& key, GetCallbackSimple cb, DoneCallbackSimple donecb, Value::Filter&& f={}, Where&& w = {})
override {
101 get(key, bindGetCb(cb), bindDoneCb(donecb), std::forward<Value::Filter>(f), std::forward<Where>(w));
107 void putSigned(
const InfoHash& hash, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
108 void putSigned(
const InfoHash& hash,
Value&& v, DoneCallback callback,
bool permanent =
false) {
109 putSigned(hash, std::make_shared<Value>(std::move(v)), callback, permanent);
117 void putEncrypted(
const InfoHash& hash,
const InfoHash& to, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
119 [[deprecated(
"Use the shared_ptr version instead")]]
120 void putEncrypted(
const InfoHash& hash,
const InfoHash& to,
Value&& v, DoneCallback callback,
bool permanent =
false) {
121 putEncrypted(hash, to, std::make_shared<Value>(std::move(v)), callback, permanent);
123 void putEncrypted(
const InfoHash& hash,
const crypto::PublicKey& to, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
125 [[deprecated(
"Use the shared_ptr version instead")]]
126 void putEncrypted(
const InfoHash& hash,
const crypto::PublicKey& to,
Value&& v, DoneCallback callback,
bool permanent =
false) {
127 putEncrypted(hash, to, std::make_shared<Value>(std::move(v)), callback, permanent);
130 void putEncrypted(
const InfoHash& hash,
const PkId& to, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
141 void findCertificate(
const InfoHash& node,
const std::function<
void(
const Sp<crypto::Certificate>)>& cb);
142 void findPublicKey(
const InfoHash& node,
const std::function<
void(
const Sp<crypto::PublicKey>)>& cb);
144 void findCertificate(
const PkId&
id,
const std::function<
void(
const Sp<crypto::Certificate>)>& cb);
145 void findPublicKey(
const PkId&
id,
const std::function<
void(
const Sp<crypto::PublicKey>)>& cb);
147 void registerCertificate(
const Sp<crypto::Certificate>& cert);
149 Sp<crypto::Certificate> getCertificate(
const InfoHash& node)
const;
150 Sp<crypto::PublicKey> getPublicKey(
const InfoHash& node)
const;
152 Sp<crypto::Certificate> getCertificate(
const PkId& node)
const;
153 Sp<crypto::PublicKey> getPublicKey(
const PkId& node)
const;
161 localQueryMethodLegacy_ = std::move(query_method);
163 void setLocalCertificateStore(CertificateStoreQuery&& query_method) {
164 localQueryMethod_ = std::move(query_method);
166 void setOnPublicAddressChanged(PublicAddressChangedCb cb)
override {
167 dht_->setOnPublicAddressChanged(cb);
173 void shutdown(ShutdownCallback cb,
bool stop =
false)
override {
174 dht_->shutdown(cb, stop);
176 void dumpTables()
const override {
179 inline const InfoHash&
getNodeId()
const override {
return dht_->getNodeId(); }
182 return dht_->getStoreSize();
184 std::string getStorageLog()
const override {
185 return dht_->getStorageLog();
187 std::string getStorageLog(
const InfoHash& h)
const override {
188 return dht_->getStorageLog(h);
191 dht_->setStorageLimit(limit);
193 size_t getStorageLimit()
const override {
194 return dht_->getStorageLimit();
198 return dht_->exportNodes();
200 std::vector<ValuesExport> exportValues()
const override {
201 return dht_->exportValues();
203 void importValues(
const std::vector<ValuesExport>& v)
override {
204 dht_->importValues(v);
206 NodeStats getNodesStats(sa_family_t af)
const override {
207 return dht_->getNodesStats(af);
209 std::vector<unsigned> getNodeMessageStats(
bool in =
false)
override {
210 return dht_->getNodeMessageStats(in);
212 std::string getRoutingTablesLog(sa_family_t af)
const override {
213 return dht_->getRoutingTablesLog(af);
215 std::string getSearchesLog(sa_family_t af)
const override {
216 return dht_->getSearchesLog(af);
218 std::string getSearchLog(
const InfoHash& h, sa_family_t af = AF_UNSPEC)
const override {
219 return dht_->getSearchLog(h, af);
221 std::vector<SockAddr> getPublicAddress(sa_family_t family = 0)
override {
222 return dht_->getPublicAddress(family);
224 time_point periodic(
const uint8_t *buf,
size_t buflen, SockAddr sa,
const time_point& now)
override {
225 return dht_->periodic(buf, buflen, std::move(sa), now);
227 time_point periodic(
const uint8_t *buf,
size_t buflen,
const sockaddr* from, socklen_t fromlen,
const time_point& now)
override {
228 return dht_->periodic(buf, buflen, from, fromlen, now);
231 return dht_->updateStatus(af);
233 NodeStatus getStatus(sa_family_t af)
const override {
234 return dht_->getStatus(af);
236 NodeStatus getStatus()
const override {
237 return dht_->getStatus();
239 net::DatagramSocket* getSocket()
const override {
240 return dht_->getSocket();
243 return dht_->isRunning(af);
245 const ValueType& getType(ValueType::Id type_id)
const override {
246 return dht_->getType(type_id);
248 void addBootstrap(
const std::string& host,
const std::string& service)
override {
249 dht_->addBootstrap(host, service);
251 void clearBootstrap()
override {
252 dht_->clearBootstrap();
255 dht_->insertNode(
id, sa);
257 void insertNode(
const NodeExport& n)
override {
260 void pingNode(SockAddr sa, DoneCallbackSimple&& cb={})
override {
261 dht_->pingNode(std::move(sa), std::move(cb));
263 void query(
const InfoHash& key, QueryCallback cb, DoneCallback done_cb = {},
Query&& q = {})
override {
264 dht_->query(key, cb, done_cb, std::move(q));
266 void query(
const InfoHash& key, QueryCallback cb, DoneCallbackSimple done_cb = {}, Query&& q = {})
override {
267 dht_->query(key, cb, done_cb, std::move(q));
270 return dht_->getLocal(key, f);
272 Sp<Value>
getLocalById(
const InfoHash& key, Value::Id vid)
const override {
273 return dht_->getLocalById(key, vid);
275 void put(
const InfoHash& key,
277 DoneCallback cb=
nullptr,
278 time_point created=time_point::max(),
279 bool permanent =
false)
override
281 dht_->put(key, v, cb, created, permanent);
283 void put(
const InfoHash& key,
285 DoneCallbackSimple cb,
286 time_point created=time_point::max(),
287 bool permanent =
false)
override
289 dht_->put(key, v, cb, created, permanent);
292 void put(
const InfoHash& key,
294 DoneCallback cb=
nullptr,
295 time_point created=time_point::max(),
296 bool permanent =
false)
override
298 dht_->put(key, std::move(v), cb, created, permanent);
300 void put(
const InfoHash& key,
302 DoneCallbackSimple cb,
303 time_point created=time_point::max(),
304 bool permanent =
false)
override
306 dht_->put(key, std::move(v), cb, created, permanent);
308 std::vector<Sp<Value>>
getPut(
const InfoHash& h)
const override {
309 return dht_->getPut(h);
311 Sp<Value>
getPut(
const InfoHash& h,
const Value::Id& vid)
const override {
312 return dht_->getPut(h, vid);
314 bool cancelPut(
const InfoHash& h,
const Value::Id& vid)
override {
315 return dht_->cancelPut(h, vid);
318 size_t listen(
const InfoHash& key, ValueCallback,
Value::Filter={}, Where={})
override;
320 size_t listen(
const InfoHash& key, GetCallbackSimple cb, Value::Filter f={}, Where w = {})
override {
321 return listen(key, bindGetCb(cb), f, w);
323 bool cancelListen(
const InfoHash& h,
size_t token)
override {
324 return dht_->cancelListen(h, token);
327 dht_->connectivityChanged(af);
329 void connectivityChanged()
override {
330 dht_->connectivityChanged();
333 void forwardAllMessages(
bool forward) {
334 forward_all_ = forward;
337 void setPushNotificationToken(
const std::string& token =
"")
override {
338 dht_->setPushNotificationToken(token);
346 return dht_->pushNotificationReceived(notification);
349 void setLogger(
const Logger& logger)
override {
350 DhtInterface::setLogger(logger);
351 dht_->setLogger(logger);
354 void setLogger(
const std::shared_ptr<Logger>& logger)
override {
355 DhtInterface::setLogger(logger);
356 dht_->setLogger(logger);
364 dht_->setLogFilter(f);
368 std::unique_ptr<DhtInterface> dht_;
373 Sp<Value> checkValue(
const Sp<Value>& v);
374 ValueCallback getCallbackFilter(
const ValueCallback&,
Value::Filter&&);
375 GetCallback getCallbackFilter(
const GetCallback&,
Value::Filter&&);
377 Sp<crypto::Certificate> registerCertificate(
const InfoHash& node,
const Blob& cert);
378 Sp<crypto::Certificate> registerCertificate(
const PkId& node,
const Blob& cert);
380 Sp<crypto::PrivateKey> key_ {};
381 Sp<crypto::Certificate> certificate_ {};
384 CertificateStoreQuery localQueryMethod_ {};
385 CertificateStoreQueryLegacy localQueryMethodLegacy_ {};
388 std::map<InfoHash, Sp<crypto::Certificate>> nodesCertificates_ {};
389 std::map<InfoHash, Sp<crypto::PublicKey>> nodesPubKeys_ {};
390 std::map<PkId, Sp<crypto::Certificate>> nodesCertificatesLong_ {};
391 std::map<PkId, Sp<crypto::PublicKey>> nodesPubKeysLong_ {};
393 std::atomic_bool forward_all_ {
false};
394 bool enableCache_ {
false};