6#include "wvstreamsdebuggerserver.h"
7#include "wvunixsocket.h"
8#include "wvtcplistener.h"
9#include "wvunixlistener.h"
11void 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';
25WvStreamsDebuggerServer::Connection::Connection(IWvStream *s) :
31void WvStreamsDebuggerServer::Connection::result_cb(WvStringParm,
38void WvStreamsDebuggerServer::Connection::send(WvStringParm code,
42 results.append(result);
47void WvStreamsDebuggerServer::Connection::send(WvStringParm code,
48 WvStringList &results)
54WvStreamsDebuggerServer::WvStreamsDebuggerServer(
const WvUnixAddr &unix_addr,
55 AuthCallback _auth_cb,
56 const WvIPPortAddr &tcp_addr) :
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);
92WvStreamsDebuggerServer::~WvStreamsDebuggerServer()
94 WvIStreamList::globallist.unlink(&streams);
99void 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");
109void WvStreamsDebuggerServer::unix_listener_close_cb()
111 log(
"Listener on %s closing\n", *unix_listener->src());
115void 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");
125void WvStreamsDebuggerServer::tcp_listener_close_cb()
127 log(
"Listener on %s closing\n", *tcp_listener->src());
131void WvStreamsDebuggerServer::auth_request_cb(Connection &s)
134 s.send(
"AUTH", s.salt);
136 s.setcallback(wv::bind(&WvStreamsDebuggerServer::auth_response_cb,
this,
141void WvStreamsDebuggerServer::auth_response_cb(Connection &s)
143 const char *line = s.getline();
150 WvString username = args.
popstr();
151 WvString encoded_salted_password = args.
popstr();
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,
169void WvStreamsDebuggerServer::ready_cb(Connection &s)
171 const char *line = s.getline();
178 WvString cmd = args.
popstr();
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");
An IP+Port address also includes a port number, with the resulting form www.xxx.yyy....
This is a WvList of WvStrings, and is a really handy way to parse strings.
WvString popstr()
get the first string in the list, or an empty string if the list is empty.
Class to easily create the Server side of a WvTCPConn.
Server end of a Unix Sockets stream.
WvString wvtcl_encode(WvList< WvString > &l, const WvStringMask &nasties=WVTCL_NASTY_SPACES, const WvStringMask &splitchars=WVTCL_SPLITCHARS)
encode a tcl-style list.
WvString wvtcl_escape(WvStringParm s, const WvStringMask &nasties=WVTCL_NASTY_SPACES)
tcl-escape a string.
void wvtcl_decode(WvList< WvString > &l, WvStringParm _s, const WvStringMask &splitchars=WVTCL_SPLITCHARS, bool do_unescape=true)
split a tcl-style list.