15class OPENDHT_PUBLIC
SecureDht final :
public DhtInterface
18 typedef std::function<void(
bool)> SignatureCheckCallback;
22 static dht::Config getConfig(
const SecureDht::Config& conf)
24 auto c = conf.node_config;
25 if (not c.node_id and conf.id.second)
26 c.
node_id = InfoHash::get(
"node:" + conf.id.second->getId().toString());
38 IdentityAnnouncedCb iacb = {},
39 const std::shared_ptr<Logger>& l = {});
43 InfoHash getId()
const {
return key_ ? key_->getPublicKey().getId() : InfoHash(); }
44 PkId getLongId()
const {
return key_ ? key_->getPublicKey().getLongId() : PkId(); }
45 Sp<crypto::PublicKey> getPublicKey()
const {
return key_ ? key_->getSharedPublicKey() : Sp<crypto::PublicKey> {}; }
47 ValueType secureType(ValueType&& type);
49 ValueType secureType(
const ValueType& type)
51 ValueType tmp_type = type;
52 return secureType(std::move(tmp_type));
55 void registerType(
const ValueType& type)
override
58 dht_->registerType(secureType(type));
60 void registerType(ValueType&& type)
63 dht_->registerType(secureType(std::forward<ValueType>(type)));
65 void registerInsecureType(
const ValueType& type)
68 dht_->registerType(type);
76 void get(
const InfoHash&
id, GetCallback cb, DoneCallback donecb = {},
Value::Filter&& = {}, Where&& w = {})
override;
77 void get(
const InfoHash&
id,
79 DoneCallbackSimple donecb = {},
80 Value::Filter&& f = {},
81 Where&& w = {})
override
83 get(
id, cb, bindDoneCb(donecb), std::forward<Value::Filter>(f), std::forward<Where>(w));
85 void get(
const InfoHash& key,
87 DoneCallback donecb = {},
88 Value::Filter&& f = {},
89 Where&& w = {})
override
91 get(key, bindGetCb(cb), donecb, std::forward<Value::Filter>(f), std::forward<Where>(w));
93 void get(
const InfoHash& key,
95 DoneCallbackSimple donecb,
96 Value::Filter&& f = {},
97 Where&& w = {})
override
99 get(key, bindGetCb(cb), bindDoneCb(donecb), std::forward<Value::Filter>(f), std::forward<Where>(w));
105 void putSigned(
const InfoHash& hash, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
106 void putSigned(
const InfoHash& hash,
Value&& v, DoneCallback callback,
bool permanent =
false)
108 putSigned(hash, std::make_shared<Value>(std::move(v)), callback, permanent);
117 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)
122 putEncrypted(hash, to, std::make_shared<Value>(std::move(v)), callback, permanent);
124 void putEncrypted(
const InfoHash& hash,
127 DoneCallback callback,
128 bool permanent =
false);
130 [[deprecated(
"Use the shared_ptr version instead")]]
132 const InfoHash& hash,
const crypto::PublicKey& to,
Value&& v, DoneCallback callback,
bool permanent =
false)
134 putEncrypted(hash, to, std::make_shared<Value>(std::move(v)), callback, permanent);
137 void putEncrypted(
const InfoHash& hash,
const PkId& to, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
148 [[deprecated(
"Use PkId version")]]
void findCertificate(
149 const InfoHash& node,
const std::function<
void(
const Sp<crypto::Certificate>)>& cb);
150 [[deprecated(
"Use PkId version")]]
void findPublicKey(
const InfoHash& node,
151 const std::function<
void(
const Sp<crypto::PublicKey>)>& cb);
153 void findCertificate(
const PkId&
id,
const std::function<
void(
const Sp<crypto::Certificate>)>& cb);
154 void findPublicKey(
const PkId&
id,
const std::function<
void(
const Sp<crypto::PublicKey>)>& cb);
156 void registerCertificate(
const Sp<crypto::Certificate>& cert);
158 [[deprecated(
"Use PkId version")]] Sp<crypto::Certificate> getCertificate(
const InfoHash& node)
const;
159 [[deprecated(
"Use PkId version")]] Sp<crypto::PublicKey> getPublicKey(
const InfoHash& node)
const;
161 Sp<crypto::Certificate> getCertificate(
const PkId& node)
const;
162 Sp<crypto::PublicKey> getPublicKey(
const PkId& node)
const;
171 localQueryMethodLegacy_ = std::move(query_method);
173 void setLocalCertificateStore(CertificateStoreQuery&& query_method) { localQueryMethod_ = std::move(query_method); }
174 void setOnPublicAddressChanged(PublicAddressChangedCb cb)
override { dht_->setOnPublicAddressChanged(cb); }
179 void shutdown(ShutdownCallback cb,
bool stop =
false)
override { dht_->shutdown(cb, stop); }
180 void dumpTables()
const override { dht_->dumpTables(); }
181 inline const InfoHash&
getNodeId()
const override {
return dht_->getNodeId(); }
183 std::pair<size_t, size_t>
getStoreSize()
const override {
return dht_->getStoreSize(); }
184 std::pair<size_t, size_t> getLocalStoreSize()
const override {
return dht_->getLocalStoreSize(); }
185 std::string getStorageLog()
const override {
return dht_->getStorageLog(); }
186 std::string getStorageLog(
const InfoHash& h)
const override {
return dht_->getStorageLog(h); }
188 size_t getStorageLimit()
const override {
return dht_->getStorageLimit(); }
190 size_t getLocalStorageLimit()
const override {
return dht_->getLocalStorageLimit(); }
192 std::vector<NodeExport>
exportNodes()
const override {
return dht_->exportNodes(); }
193 std::vector<ValuesExport> exportValues()
const override {
return dht_->exportValues(); }
194 void importValues(
const std::vector<ValuesExport>& v)
override { dht_->importValues(v); }
195 NodeStats getNodesStats(sa_family_t af)
const override {
return dht_->getNodesStats(af); }
197 NodeInfo getNodeInfo()
201 info.node_id = getNodeId();
202 info.ipv4 = getNodesStats(AF_INET);
203 info.ipv6 = getNodesStats(AF_INET6);
204 std::tie(info.storage_size, info.storage_values) = getStoreSize();
205 std::tie(info.local_storage_size, info.local_storage_values) = getLocalStoreSize();
206 if (
auto sock = getSocket()) {
207 info.bound4 = sock->getBoundRef(AF_INET).getPort();
208 info.bound6 = sock->getBoundRef(AF_INET6).getPort();
213 std::vector<unsigned> getNodeMessageStats(
bool in =
false)
override {
return dht_->getNodeMessageStats(in); }
214 std::string getRoutingTablesLog(sa_family_t af)
const override {
return dht_->getRoutingTablesLog(af); }
215 std::string getSearchesLog(sa_family_t af)
const override {
return dht_->getSearchesLog(af); }
216 std::string getSearchLog(
const InfoHash& h, sa_family_t af = AF_UNSPEC)
const override
218 return dht_->getSearchLog(h, af);
220 std::vector<SockAddr> getPublicAddress(sa_family_t family = 0)
override {
return dht_->getPublicAddress(family); }
221 time_point periodic(
const uint8_t* buf,
size_t buflen, SockAddr sa,
const time_point& now)
override
223 return dht_->periodic(buf, buflen, std::move(sa), now);
226 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 NodeStatus getStatus(sa_family_t af)
const override {
return dht_->getStatus(af); }
232 NodeStatus getStatus()
const override {
return dht_->getStatus(); }
233 net::DatagramSocket* getSocket()
const override {
return dht_->getSocket(); };
234 bool isRunning(sa_family_t af = 0)
const override {
return dht_->isRunning(af); }
235 const ValueType& getType(ValueType::Id type_id)
const override {
return dht_->getType(type_id); }
236 void addBootstrap(
const std::string& host,
const std::string& service)
override
238 dht_->addBootstrap(host, service);
240 void clearBootstrap()
override { dht_->clearBootstrap(); }
242 void insertNode(
const NodeExport& n)
override { dht_->insertNode(n); }
243 void pingNode(SockAddr sa, DoneCallbackSimple&& cb = {})
override { dht_->pingNode(std::move(sa), std::move(cb)); }
244 void query(
const InfoHash& key, QueryCallback cb, DoneCallback done_cb = {},
Query&& q = {})
override
246 dht_->query(key, cb, done_cb, std::move(q));
248 void query(
const InfoHash& key, QueryCallback cb, DoneCallbackSimple done_cb = {}, Query&& q = {})
override
250 dht_->query(key, cb, done_cb, std::move(q));
254 return dht_->getLocal(key, f);
256 Sp<Value>
getLocalById(
const InfoHash& key, Value::Id vid)
const override {
return dht_->getLocalById(key, vid); }
257 void put(
const InfoHash& key,
259 DoneCallback cb =
nullptr,
260 time_point created = time_point::max(),
261 bool permanent =
false)
override
263 dht_->put(key, v, cb, created, permanent);
265 void put(
const InfoHash& key,
267 DoneCallbackSimple cb,
268 time_point created = time_point::max(),
269 bool permanent =
false)
override
271 dht_->put(key, v, cb, created, permanent);
274 void put(
const InfoHash& key,
276 DoneCallback cb =
nullptr,
277 time_point created = time_point::max(),
278 bool permanent =
false)
override
280 dht_->put(key, std::move(v), cb, created, permanent);
282 void put(
const InfoHash& key,
284 DoneCallbackSimple cb,
285 time_point created = time_point::max(),
286 bool permanent =
false)
override
288 dht_->put(key, std::move(v), cb, created, permanent);
290 std::vector<Sp<Value>>
getPut(
const InfoHash& h)
const override {
return dht_->getPut(h); }
291 Sp<Value>
getPut(
const InfoHash& h,
const Value::Id& vid)
const override {
return dht_->getPut(h, vid); }
292 bool cancelPut(
const InfoHash& h,
const Value::Id& vid)
override {
return dht_->cancelPut(h, vid); }
294 size_t listen(
const InfoHash& key, ValueCallback,
Value::Filter = {}, Where = {})
override;
296 size_t listen(
const InfoHash& key, GetCallbackSimple cb, Value::Filter f = {}, Where w = {})
override
298 return listen(key, bindGetCb(cb), f, w);
300 bool cancelListen(
const InfoHash& h,
size_t token)
override {
return dht_->cancelListen(h, token); }
302 void connectivityChanged()
override { dht_->connectivityChanged(); }
304 void forwardAllMessages(
bool forward) { forward_all_ = forward; }
306 void setPushNotificationToken(
const std::string& token =
"")
override { dht_->setPushNotificationToken(token); }
314 return dht_->pushNotificationReceived(notification);
317 void setLogger(
const std::shared_ptr<Logger>& logger)
override
319 DhtInterface::setLogger(logger);
320 dht_->setLogger(logger);
329 dht_->setLogFilter(f);
333 std::unique_ptr<DhtInterface> dht_;
338 Sp<Value> checkValue(
const Sp<Value>& v);
339 ValueCallback getCallbackFilter(
const ValueCallback&,
Value::Filter&&);
340 GetCallback getCallbackFilter(
const GetCallback&,
Value::Filter&&);
342 Sp<crypto::Certificate> registerCertificate(
const InfoHash& node,
const Blob& cert);
343 Sp<crypto::Certificate> registerCertificate(
const PkId& node,
const Blob& cert);
345 Sp<crypto::PrivateKey> key_ {};
346 Sp<crypto::Certificate> certificate_ {};
349 CertificateStoreQuery localQueryMethod_ {};
350 CertificateStoreQueryLegacy localQueryMethodLegacy_ {};
353 std::map<InfoHash, Sp<crypto::Certificate>> nodesCertificates_ {};
354 std::map<InfoHash, Sp<crypto::PublicKey>> nodesPubKeys_ {};
355 std::map<PkId, Sp<crypto::Certificate>> nodesCertificatesLong_ {};
356 std::map<PkId, Sp<crypto::PublicKey>> nodesPubKeysLong_ {};
358 std::atomic_bool forward_all_ {
false};
359 bool enableCache_ {
false};