Bitcoin Core 22.99.0
P2P Digital Currency
torcontrol.h
Go to the documentation of this file.
1// Copyright (c) 2015-2020 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
8#ifndef BITCOIN_TORCONTROL_H
9#define BITCOIN_TORCONTROL_H
10
11#include <fs.h>
12#include <netaddress.h>
13
14#include <boost/signals2/signal.hpp>
15
16#include <event2/bufferevent.h>
17#include <event2/event.h>
18
19#include <cstdlib>
20#include <deque>
21#include <functional>
22#include <string>
23#include <vector>
24
25class CService;
26
27extern const std::string DEFAULT_TOR_CONTROL;
28static const bool DEFAULT_LISTEN_ONION = true;
29
30void StartTorControl(CService onion_service_target);
32void StopTorControl();
33
35
38{
39public:
41
42 int code;
43 std::vector<std::string> lines;
44
45 void Clear()
46 {
47 code = 0;
48 lines.clear();
49 }
50};
51
56{
57public:
58 typedef std::function<void(TorControlConnection&)> ConnectionCB;
59 typedef std::function<void(TorControlConnection &,const TorControlReply &)> ReplyHandlerCB;
60
63 explicit TorControlConnection(struct event_base *base);
65
73 bool Connect(const std::string& tor_control_center, const ConnectionCB& connected, const ConnectionCB& disconnected);
74
78 void Disconnect();
79
84 bool Command(const std::string &cmd, const ReplyHandlerCB& reply_handler);
85
87 boost::signals2::signal<void(TorControlConnection &,const TorControlReply &)> async_handler;
88private:
90 std::function<void(TorControlConnection&)> connected;
92 std::function<void(TorControlConnection&)> disconnected;
94 struct event_base *base;
96 struct bufferevent *b_conn;
100 std::deque<ReplyHandlerCB> reply_handlers;
101
103 static void readcb(struct bufferevent *bev, void *ctx);
104 static void eventcb(struct bufferevent *bev, short what, void *ctx);
105};
106
107/****** Bitcoin specific TorController implementation ********/
108
113{
114public:
115 TorController(struct event_base* base, const std::string& tor_control_center, const CService& target);
116 TorController() : conn{nullptr} {
117 // Used for testing only.
118 }
120
123
125 void Reconnect();
126private:
127 struct event_base* base;
128 const std::string m_tor_control_center;
130 std::string private_key;
131 std::string service_id;
133 struct event *reconnect_ev = nullptr;
138 std::vector<uint8_t> cookie;
140 std::vector<uint8_t> clientNonce;
141
142public:
155
157 static void reconnect_cb(evutil_socket_t fd, short what, void *arg);
158};
159
160#endif /* BITCOIN_TORCONTROL_H */
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:523
Low-level handling for Tor control connection.
Definition: torcontrol.h:56
TorControlReply message
Message being received.
Definition: torcontrol.h:98
std::deque< ReplyHandlerCB > reply_handlers
Response handlers.
Definition: torcontrol.h:100
boost::signals2::signal< void(TorControlConnection &, const TorControlReply &)> async_handler
Response handlers for async replies.
Definition: torcontrol.h:87
bool Connect(const std::string &tor_control_center, const ConnectionCB &connected, const ConnectionCB &disconnected)
Connect to a Tor control port.
Definition: torcontrol.cpp:134
TorControlConnection(struct event_base *base)
Create a new TorControlConnection.
Definition: torcontrol.cpp:61
bool Command(const std::string &cmd, const ReplyHandlerCB &reply_handler)
Send a command, register a handler for the reply.
Definition: torcontrol.cpp:178
std::function< void(TorControlConnection &)> connected
Callback when ready for use.
Definition: torcontrol.h:90
static void readcb(struct bufferevent *bev, void *ctx)
Libevent handlers: internal.
Definition: torcontrol.cpp:72
std::function< void(TorControlConnection &, const TorControlReply &)> ReplyHandlerCB
Definition: torcontrol.h:59
static void eventcb(struct bufferevent *bev, short what, void *ctx)
Definition: torcontrol.cpp:117
std::function< void(TorControlConnection &)> disconnected
Callback when connection lost.
Definition: torcontrol.h:92
std::function< void(TorControlConnection &)> ConnectionCB
Definition: torcontrol.h:58
void Disconnect()
Disconnect from Tor control port.
Definition: torcontrol.cpp:171
struct bufferevent * b_conn
Connection to control socket.
Definition: torcontrol.h:96
struct event_base * base
Libevent event base.
Definition: torcontrol.h:94
Reply from Tor, can be single or multi-line.
Definition: torcontrol.h:38
std::vector< std::string > lines
Definition: torcontrol.h:43
Controller that connects to Tor control socket, authenticate, then create and maintain an ephemeral o...
Definition: torcontrol.h:113
TorControlConnection conn
Definition: torcontrol.h:129
static void reconnect_cb(evutil_socket_t fd, short what, void *arg)
Callback for reconnect timer.
Definition: torcontrol.cpp:577
std::string service_id
Definition: torcontrol.h:131
struct event_base * base
Definition: torcontrol.h:127
fs::path GetPrivateKeyFile()
Get name of file to store private key in.
Definition: torcontrol.cpp:572
std::vector< uint8_t > clientNonce
ClientNonce for SAFECOOKIE auth.
Definition: torcontrol.h:140
void connected_cb(TorControlConnection &conn)
Callback after successful connection.
Definition: torcontrol.cpp:535
void add_onion_cb(TorControlConnection &conn, const TorControlReply &reply)
Callback for ADD_ONION result.
Definition: torcontrol.cpp:337
const std::string m_tor_control_center
Definition: torcontrol.h:128
void disconnected_cb(TorControlConnection &conn)
Callback after connection lost or failed connection attempt.
Definition: torcontrol.cpp:543
const CService m_target
Definition: torcontrol.h:136
void authchallenge_cb(TorControlConnection &conn, const TorControlReply &reply)
Callback for AUTHCHALLENGE result.
Definition: torcontrol.cpp:426
CService service
Definition: torcontrol.h:135
std::vector< uint8_t > cookie
Cookie for SAFECOOKIE auth.
Definition: torcontrol.h:138
struct event * reconnect_ev
Definition: torcontrol.h:133
float reconnect_timeout
Definition: torcontrol.h:134
void auth_cb(TorControlConnection &conn, const TorControlReply &reply)
Callback for AUTHENTICATE result.
Definition: torcontrol.cpp:372
void Reconnect()
Reconnect, after getting disconnected.
Definition: torcontrol.cpp:561
std::string private_key
Definition: torcontrol.h:130
void protocolinfo_cb(TorControlConnection &conn, const TorControlReply &reply)
Callback for PROTOCOLINFO result.
Definition: torcontrol.cpp:461
Path class wrapper to prepare application code for transition from boost::filesystem library to std::...
Definition: fs.h:34
static secp256k1_context * ctx
Definition: tests.c:42
CService DefaultOnionServiceTarget()
Definition: torcontrol.cpp:633
const std::string DEFAULT_TOR_CONTROL
Default control port.
Definition: torcontrol.cpp:40
static const bool DEFAULT_LISTEN_ONION
Definition: torcontrol.h:28
void InterruptTorControl()
Definition: torcontrol.cpp:614
void StartTorControl(CService onion_service_target)
Definition: torcontrol.cpp:595
void StopTorControl()
Definition: torcontrol.cpp:624