6 #include "wvstreamsdebuggerserver.h" 7 #include "wvunixsocket.h" 8 #include "wvtcplistener.h" 9 #include "wvunixlistener.h" 11 void WvStreamsDebuggerServer::Connection::choose_salt()
13 const int salt_size = 8;
14 const int salt_alphabet_size = 26+26+10;
15 const char salt_chars[salt_alphabet_size+1] =
16 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
18 salt.setsize(salt_size+1);
19 for (
int i=0; i<salt_size; ++i)
20 salt.edit()[i] = salt_chars[rand() % salt_alphabet_size];
21 salt.edit()[salt_size] =
'\0';
25 WvStreamsDebuggerServer::Connection::Connection(
IWvStream *s) :
31 void WvStreamsDebuggerServer::Connection::result_cb(
WvStringParm,
38 void WvStreamsDebuggerServer::Connection::send(
WvStringParm code,
42 results.append(result);
47 void WvStreamsDebuggerServer::Connection::send(
WvStringParm code,
54 WvStreamsDebuggerServer::WvStreamsDebuggerServer(
const WvUnixAddr &unix_addr,
55 AuthCallback _auth_cb,
57 log(
"WvStreamsDebuggerServer",
WvLog::Debug3),
62 WvIStreamList::globallist.append(&streams,
false,
"debugger streams");
68 unix_listener->set_wsname(
"wsd listener on %s", unix_addr);
69 unix_listener->onaccept(
70 wv::bind(&WvStreamsDebuggerServer::unix_listener_cb,
this, _1));
71 unix_listener->setclosecallback(
72 wv::bind(&WvStreamsDebuggerServer::unix_listener_close_cb,
this));
73 streams.append(unix_listener,
true,
"debugger unix listener");
74 log(
"Listening on %s\n", unix_addr);
81 tcp_listener->set_wsname(
"wsd listener on %s", tcp_addr);
82 tcp_listener->onaccept(
83 wv::bind(&WvStreamsDebuggerServer::tcp_listener_cb,
this, _1));
84 tcp_listener->setclosecallback(
85 wv::bind(&WvStreamsDebuggerServer::tcp_listener_close_cb,
this));
86 streams.append(tcp_listener,
true,
"debugger tcp listener");
87 log(
"Listening on %s\n", tcp_addr);
92 WvStreamsDebuggerServer::~WvStreamsDebuggerServer()
94 WvIStreamList::globallist.unlink(&streams);
99 void WvStreamsDebuggerServer::unix_listener_cb(
IWvStream *unix_conn)
101 log(
"Accepted connection from %s\n", *unix_conn->src());
102 Connection *conn =
new Connection(unix_conn);
103 conn->setcallback(wv::bind(&WvStreamsDebuggerServer::ready_cb,
this,
105 streams.append(conn,
true,
"debugger unix connection");
109 void WvStreamsDebuggerServer::unix_listener_close_cb()
111 log(
"Listener on %s closing\n", *unix_listener->src());
115 void WvStreamsDebuggerServer::tcp_listener_cb(
IWvStream *tcp_conn)
117 log(
"Accepted connection from %s\n", *tcp_conn->src());
118 Connection *conn =
new Connection(tcp_conn);
119 conn->setcallback(wv::bind(&WvStreamsDebuggerServer::ready_cb,
this,
121 streams.append(conn,
true,
"debugger tcp connection");
125 void WvStreamsDebuggerServer::tcp_listener_close_cb()
127 log(
"Listener on %s closing\n", *tcp_listener->src());
131 void WvStreamsDebuggerServer::auth_request_cb(Connection &s)
134 s.send(
"AUTH", s.salt);
136 s.setcallback(wv::bind(&WvStreamsDebuggerServer::auth_response_cb,
this,
141 void WvStreamsDebuggerServer::auth_response_cb(Connection &s)
143 const char *line = s.getline();
153 if (!auth_cb || !username || !encoded_salted_password
154 || !auth_cb(username, s.salt, encoded_salted_password))
156 s.send(
"ERROR",
"Authentication failure");
157 s.setcallback(wv::bind(&WvStreamsDebuggerServer::auth_request_cb,
162 s.send(
"OK",
"Authenticated");
163 s.setcallback(wv::bind(&WvStreamsDebuggerServer::ready_cb,
this,
169 void WvStreamsDebuggerServer::ready_cb(Connection &s)
171 const char *line = s.getline();
181 s.send(
"ERROR",
"Empty command");
185 WvString result = s.debugger.run(cmd, args,
186 wv::bind(&Connection::result_cb, &s,
189 s.send(
"ERROR", result);
191 s.send(
"OK",
"Command successful");
A WvFastString acts exactly like a WvString, but can take (const char *) strings without needing to a...
WvString wvtcl_encode(WvList< WvString > &l, const WvStringMask &nasties=WVTCL_NASTY_SPACES, const WvStringMask &splitchars=WVTCL_SPLITCHARS)
encode a tcl-style list.
A Unix domain socket address is really just a filename.
WvString popstr()
get the first string in the list, or an empty string if the list is empty.
An IP+Port address also includes a port number, with the resulting form www.xxx.yyy.zzz:pppp.
Class to easily create the Server side of a WvTCPConn.
void wvtcl_decode(WvList< WvString > &l, WvStringParm _s, const WvStringMask &splitchars=WVTCL_SPLITCHARS, bool do_unescape=true)
split a tcl-style list.
Server end of a Unix Sockets stream.
This is a WvList of WvStrings, and is a really handy way to parse strings.
WvString wvtcl_escape(WvStringParm s, const WvStringMask &nasties=WVTCL_NASTY_SPACES)
tcl-escape a string.
WvString is an implementation of a simple and efficient printable-string class.
A WvLog stream accepts log messages from applications and forwards them to all registered WvLogRcv's...
WvStreamClone simply forwards all requests to the "cloned" stream.