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);
119 DoneCallback callback,
120 bool permanent =
false);
122 [[deprecated(
"Use the shared_ptr version instead")]]
124 const InfoHash& hash,
const crypto::PublicKey& to,
Value&& v, DoneCallback callback,
bool permanent =
false)
126 putEncrypted(hash, to, std::make_shared<Value>(std::move(v)), callback, permanent);
129 void putEncrypted(
const InfoHash& hash,
const PkId& to, Sp<Value> val, DoneCallback callback,
bool permanent =
false);
140 void findCertificate(
const PkId&
id,
const std::function<
void(
const Sp<crypto::Certificate>)>& cb);
141 void findPublicKey(
const PkId&
id,
const std::function<
void(
const Sp<crypto::PublicKey>)>& cb);
143 void registerCertificate(
const Sp<crypto::Certificate>& cert);
145 Sp<crypto::Certificate> getCertificate(
const PkId& node)
const;
146 Sp<crypto::PublicKey> getPublicKey(
const PkId& node)
const;
154 void setOnPublicAddressChanged(PublicAddressChangedCb cb)
override { dht_->setOnPublicAddressChanged(cb); }
159 void shutdown(ShutdownCallback cb,
bool stop =
false)
override { dht_->shutdown(cb, stop); }
160 void dumpTables()
const override { dht_->dumpTables(); }
161 inline const InfoHash&
getNodeId()
const override {
return dht_->getNodeId(); }
163 std::pair<size_t, size_t>
getStoreSize()
const override {
return dht_->getStoreSize(); }
164 std::pair<size_t, size_t> getLocalStoreSize()
const override {
return dht_->getLocalStoreSize(); }
165 std::string getStorageLog()
const override {
return dht_->getStorageLog(); }
166 std::string getStorageLog(
const InfoHash& h)
const override {
return dht_->getStorageLog(h); }
168 size_t getStorageLimit()
const override {
return dht_->getStorageLimit(); }
170 size_t getLocalStorageLimit()
const override {
return dht_->getLocalStorageLimit(); }
172 std::vector<NodeExport>
exportNodes()
const override {
return dht_->exportNodes(); }
173 std::vector<ValuesExport> exportValues()
const override {
return dht_->exportValues(); }
174 void importValues(
const std::vector<ValuesExport>& v)
override { dht_->importValues(v); }
175 NodeStats getNodesStats(sa_family_t af)
const override {
return dht_->getNodesStats(af); }
177 NodeInfo getNodeInfo()
181 info.node_id = getNodeId();
182 info.ipv4 = getNodesStats(AF_INET);
183 info.ipv6 = getNodesStats(AF_INET6);
184 std::tie(info.storage_size, info.storage_values) = getStoreSize();
185 std::tie(info.local_storage_size, info.local_storage_values) = getLocalStoreSize();
186 if (
auto sock = getSocket()) {
187 info.bound4 = sock->getBoundRef(AF_INET).getPort();
188 info.bound6 = sock->getBoundRef(AF_INET6).getPort();
193 std::vector<unsigned> getNodeMessageStats(
bool in =
false)
override {
return dht_->getNodeMessageStats(in); }
194 std::string getRoutingTablesLog(sa_family_t af)
const override {
return dht_->getRoutingTablesLog(af); }
195 std::string getSearchesLog(sa_family_t af)
const override {
return dht_->getSearchesLog(af); }
196 std::string getSearchLog(
const InfoHash& h, sa_family_t af = AF_UNSPEC)
const override
198 return dht_->getSearchLog(h, af);
200 std::vector<SockAddr> getPublicAddress(sa_family_t family = 0)
override {
return dht_->getPublicAddress(family); }
201 time_point periodic(
const uint8_t* buf,
size_t buflen, SockAddr sa,
const time_point& now)
override
203 return dht_->periodic(buf, buflen, std::move(sa), now);
206 const uint8_t* buf,
size_t buflen,
const sockaddr* from, socklen_t fromlen,
const time_point& now)
override
208 return dht_->periodic(buf, buflen, from, fromlen, now);
211 NodeStatus getStatus(sa_family_t af)
const override {
return dht_->getStatus(af); }
212 NodeStatus getStatus()
const override {
return dht_->getStatus(); }
213 net::DatagramSocket* getSocket()
const override {
return dht_->getSocket(); };
214 bool isRunning(sa_family_t af = 0)
const override {
return dht_->isRunning(af); }
215 const ValueType& getType(ValueType::Id type_id)
const override {
return dht_->getType(type_id); }
216 void addBootstrap(
const std::string& host,
const std::string& service)
override
218 dht_->addBootstrap(host, service);
220 void clearBootstrap()
override { dht_->clearBootstrap(); }
222 void insertNode(
const NodeExport& n)
override { dht_->insertNode(n); }
223 void pingNode(SockAddr sa, DoneCallbackSimple&& cb = {})
override { dht_->pingNode(std::move(sa), std::move(cb)); }
224 void query(
const InfoHash& key, QueryCallback cb, DoneCallback done_cb = {},
Query&& q = {})
override
226 dht_->query(key, cb, done_cb, std::move(q));
228 void query(
const InfoHash& key, QueryCallback cb, DoneCallbackSimple done_cb = {}, Query&& q = {})
override
230 dht_->query(key, cb, done_cb, std::move(q));
234 return dht_->getLocal(key, f);
236 Sp<Value>
getLocalById(
const InfoHash& key, Value::Id vid)
const override {
return dht_->getLocalById(key, vid); }
237 void put(
const InfoHash& key,
239 DoneCallback cb =
nullptr,
240 time_point created = time_point::max(),
241 bool permanent =
false)
override
243 dht_->put(key, v, cb, created, permanent);
245 void put(
const InfoHash& key,
247 DoneCallbackSimple cb,
248 time_point created = time_point::max(),
249 bool permanent =
false)
override
251 dht_->put(key, v, cb, created, permanent);
254 void put(
const InfoHash& key,
256 DoneCallback cb =
nullptr,
257 time_point created = time_point::max(),
258 bool permanent =
false)
override
260 dht_->put(key, std::move(v), cb, created, permanent);
262 void put(
const InfoHash& key,
264 DoneCallbackSimple cb,
265 time_point created = time_point::max(),
266 bool permanent =
false)
override
268 dht_->put(key, std::move(v), cb, created, permanent);
270 std::vector<Sp<Value>>
getPut(
const InfoHash& h)
const override {
return dht_->getPut(h); }
271 Sp<Value>
getPut(
const InfoHash& h,
const Value::Id& vid)
const override {
return dht_->getPut(h, vid); }
272 bool cancelPut(
const InfoHash& h,
const Value::Id& vid)
override {
return dht_->cancelPut(h, vid); }
274 size_t listen(
const InfoHash& key, ValueCallback,
Value::Filter = {}, Where = {})
override;
276 size_t listen(
const InfoHash& key, GetCallbackSimple cb, Value::Filter f = {}, Where w = {})
override
278 return listen(key, bindGetCb(cb), f, w);
280 bool cancelListen(
const InfoHash& h,
size_t token)
override {
return dht_->cancelListen(h, token); }
282 void connectivityChanged()
override { dht_->connectivityChanged(); }
284 void forwardAllMessages(
bool forward) { forward_all_ = forward; }
286 void setPushNotificationToken(
const std::string& token =
"")
override { dht_->setPushNotificationToken(token); }
294 return dht_->pushNotificationReceived(notification);
297 void setLogger(
const std::shared_ptr<Logger>& logger)
override
299 DhtInterface::setLogger(logger);
300 dht_->setLogger(logger);
309 dht_->setLogFilter(f);
313 std::unique_ptr<DhtInterface> dht_;
318 Sp<Value> checkValue(
const Sp<Value>& v);
319 ValueCallback getCallbackFilter(
const ValueCallback&,
Value::Filter&&);
320 GetCallback getCallbackFilter(
const GetCallback&,
Value::Filter&&);
322 Sp<crypto::Certificate> registerCertificate(
const InfoHash& node,
const Blob& cert);
323 Sp<crypto::Certificate> registerCertificate(
const PkId& node,
const Blob& cert);
325 Sp<crypto::PrivateKey> key_ {};
326 Sp<crypto::Certificate> certificate_ {};
329 CertificateStoreQuery localQueryMethod_ {};
332 std::map<PkId, Sp<crypto::Certificate>> nodesCertificates_ {};
333 std::map<PkId, Sp<crypto::PublicKey>> nodesPubKeys_ {};
335 std::atomic_bool forward_all_ {
false};
336 bool enableCache_ {
false};