19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
25 #define SAM_INVALID_SOCKET (-1)
26 #define SAM_SOCKET_ERROR (-1)
28 #define SAM_DEFAULT_ADDRESS "127.0.0.1"
29 #define SAM_DEFAULT_PORT 7656
30 #define SAM_DEFAULT_MIN_VER "3.0"
31 #define SAM_DEFAULT_MAX_VER "3.0"
32 #define SAM_GENERATE_MY_DESTINATION "TRANSIENT"
33 #define SAM_MY_NAME "ME"
34 #define SAM_DEFAULT_I2P_OPTIONS ""
36 #define SAM_NAME_INBOUND_QUANTITY "inbound.quantity"
37 #define SAM_DEFAULT_INBOUND_QUANTITY 3 // Three tunnels is default now
38 #define SAM_NAME_INBOUND_LENGTH "inbound.length"
39 #define SAM_DEFAULT_INBOUND_LENGTH 3 // Three jumps is default now
40 #define SAM_NAME_INBOUND_LENGTHVARIANCE "inbound.lengthVariance"
41 #define SAM_DEFAULT_INBOUND_LENGTHVARIANCE 0
42 #define SAM_NAME_INBOUND_BACKUPQUANTITY "inbound.backupQuantity"
43 #define SAM_DEFAULT_INBOUND_BACKUPQUANTITY 1 // One backup tunnel
44 #define SAM_NAME_INBOUND_ALLOWZEROHOP "inbound.allowZeroHop"
45 #define SAM_DEFAULT_INBOUND_ALLOWZEROHOP true
46 #define SAM_NAME_INBOUND_IPRESTRICTION "inbound.IPRestriction"
47 #define SAM_DEFAULT_INBOUND_IPRESTRICTION 2
48 #define SAM_NAME_OUTBOUND_QUANTITY "outbound.quantity"
49 #define SAM_DEFAULT_OUTBOUND_QUANTITY 3
50 #define SAM_NAME_OUTBOUND_LENGTH "outbound.length"
51 #define SAM_DEFAULT_OUTBOUND_LENGTH 3
52 #define SAM_NAME_OUTBOUND_LENGTHVARIANCE "outbound.lengthVariance"
53 #define SAM_DEFAULT_OUTBOUND_LENGTHVARIANCE 0
54 #define SAM_NAME_OUTBOUND_BACKUPQUANTITY "outbound.backupQuantity"
55 #define SAM_DEFAULT_OUTBOUND_BACKUPQUANTITY 1
56 #define SAM_NAME_OUTBOUND_ALLOWZEROHOP "outbound.allowZeroHop"
57 #define SAM_DEFAULT_OUTBOUND_ALLOWZEROHOP true
58 #define SAM_NAME_OUTBOUND_IPRESTRICTION "outbound.IPRestriction"
59 #define SAM_DEFAULT_OUTBOUND_IPRESTRICTION 2
60 #define SAM_NAME_OUTBOUND_PRIORITY "outbound.priority"
61 #define SAM_DEFAULT_OUTBOUND_PRIORITY 0
193 : status(status), value(value) {}
195 : status(status), value() {}
198 static std::string
hello(
const std::string& minVer,
const std::string& maxVer);
200 static std::string
streamAccept(
const std::string& sessionID,
bool silent =
false);
201 static std::string
streamConnect(
const std::string& sessionID,
const std::string& destination,
bool silent =
false);
202 static std::string
streamForward(
const std::string& sessionID,
const std::string& host, uint16_t port,
bool silent =
false);
204 static std::string
namingLookup(
const std::string& name);
208 static std::string
getValue(
const std::string& answer,
const std::string& key);
216 Socket(
const std::string& SAMHost, uint16_t SAMPort,
const std::string &minVer,
const std::string& maxVer);
217 Socket(
const sockaddr_in& addr,
const std::string& minVer,
const std::string& maxVer);
224 void write(
const std::string& msg);
232 const std::string&
getHost()
const;
249 static int instances_;
250 static void initWSA();
251 static void freeWSA();
268 :pub(pub), priv(priv), isGenerated(isGenerated) {}
281 : isOk(true), value(value) {}
288 struct RequestResultRef
294 : isOk(isOk), value(value) {}
304 : isOk(true), value(value) {}
309 : isOk(ref.isOk), value(ref.value) {}
313 if (value.get() != ref.value)
316 value.reset(ref.value);
321 operator RequestResultRef()
323 return RequestResultRef(this->isOk, this->value.release());
343 const std::string& nickname,
390 : socket(socket), host(host), port(port), silent(silent) {}
const std::string & getMaxVer() const
#define SAM_DEFAULT_ADDRESS
const std::string sessionID_
const std::string & getSAMVersion() const
static std::string streamAccept(const std::string &sessionID, bool silent=false)
RequestResult< std::auto_ptr< Socket > > accept(bool silent)
const std::string & getOptions() const
const std::string & getSAMMaxVer() const
const std::string & getVersion() const
uint16_t getSAMPort() const
RequestResult< void > forward(const std::string &host, uint16_t port, bool silent)
const std::string maxVer_
RequestResult & operator=(RequestResultRef ref)
static std::string destGenerate()
static Message::Answer< const std::string > rawRequest(Socket &socket, const std::string &requestStr)
const std::string & getSAMMinVer() const
FullDestination myDestination_
static Message::Answer< const std::string > request(Socket &socket, const std::string &requestStr, const std::string &keyOnSuccess)
Answer(Message::eStatus status, const T &value)
Socket(const std::string &SAMHost, uint16_t SAMPort, const std::string &minVer, const std::string &maxVer)
#define SAM_DEFAULT_MIN_VER
FullDestination createStreamSession(const std::string &destination)
const Message::eStatus status
const std::string nickname_
const std::string & getHost() const
static std::string createSAMRequest(const char *format,...)
static std::string streamForward(const std::string &sessionID, const std::string &host, uint16_t port, bool silent=false)
#define SAM_DEFAULT_I2P_OPTIONS
const std::string minVer_
RequestResult< const std::string > namingLookup(const std::string &name) const
RequestResult< std::auto_ptr< Socket > > connect(const std::string &destination, bool silent)
RequestResultRef(bool isOk, T *value)
static eStatus checkAnswer(const std::string &answer)
const FullDestination & getMyDestination() const
ForwardedStream(Socket *socket, const std::string &host, uint16_t port, bool silent)
const std::string i2pOptions_
RequestResult(const T &value)
static std::string hello(const std::string &minVer, const std::string &maxVer)
std::list< ForwardedStream > ForwardedStreamsContainer
#define SAM_GENERATE_MY_DESTINATION
Socket & operator=(const Socket &)
StreamSession(const std::string &nickname, const std::string &SAMHost=SAM_DEFAULT_ADDRESS, uint16_t SAMPort=SAM_DEFAULT_PORT, const std::string &destination=SAM_GENERATE_MY_DESTINATION, const std::string &i2pOptions=SAM_DEFAULT_I2P_OPTIONS, const std::string &minVer=SAM_DEFAULT_MIN_VER, const std::string &maxVer=SAM_DEFAULT_MAX_VER)
static std::string streamConnect(const std::string &sessionID, const std::string &destination, bool silent=false)
const sockaddr_in & getSAMAddress() const
const std::string & getSessionID() const
static std::string generateSessionID()
const sockaddr_in & getAddress() const
RequestResult(std::auto_ptr< T > &value)
static std::string namingLookup(const std::string &name)
static std::string sessionCreate(SessionStyle style, const std::string &sessionID, const std::string &nickname, const std::string &destination=SAM_GENERATE_MY_DESTINATION, const std::string &options="")
StreamSession & operator=(const StreamSession &rhs)
static std::string getValue(const std::string &answer, const std::string &key)
const std::string & getSAMHost() const
void write(const std::string &msg)
ForwardedStreamsContainer forwardedStreams_
const std::string & getMinVer() const
const std::string & getNickname() const
void stopForwarding(const std::string &host, uint16_t port)
RequestResult(RequestResultRef ref)
#define SAM_DEFAULT_MAX_VER
Answer(Message::eStatus status)
FullDestination(const std::string &pub, const std::string &priv, bool isGenerated)
RequestResult< const FullDestination > destGenerate() const