diff options
author | Robey Pointer <robey@lag.net> | 2003-11-09 21:14:21 +0000 |
---|---|---|
committer | Robey Pointer <robey@lag.net> | 2003-11-09 21:14:21 +0000 |
commit | 5a4871439498fdd0cb8ea391852fc604470b2668 (patch) | |
tree | 497430ed3d15e634267805fe14eca98cd158b402 /demo-server.py | |
parent | 79fecc456499cc12e56e373871991cf804468a9d (diff) |
[project @ Arch-1:robey@lag.net--2003-public%secsh--dev--1.0--patch-5]
big chunk of work which makes server code 95% done
fixed auth check methods to return just a result (failed, succeeded,
partially succeeded) and always use get_allowed_auths to determine the
list of allowed auth methods to return.
channel's internal API changed a bit to allow for client-side vs.
server-side channels. we now honor the "want-reply" bit from channel
requests. in server mode (for now), we automatically allow pty-req
and shell requests without doing anything.
ChannelFile was fixed up a bit to support universal newlines. readline
got rewritten: the old way used the "greedy" read call from ChannelFile,
which won't work if the socket doesn't have that much data buffered and
ready. now it uses recv directly, and tracks the different newlines.
demo-server.py now answers to a single shell request (like a CLI ssh
tool will make) and does a very simple demo pretending to be a BBS.
transport: fixed a bug with parsing the remote side's banner. channel
requests are passed to another method in server mode, to determine if
we should allow it. new allowed channels are added to an accept queue,
and a new method 'accept' (with timeout) will block until the next
incoming channel is ready.
Diffstat (limited to 'demo-server.py')
-rwxr-xr-x | demo-server.py | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/demo-server.py b/demo-server.py index 1db02230..b0f8326a 100755 --- a/demo-server.py +++ b/demo-server.py @@ -1,6 +1,6 @@ #!/usr/bin/python -import sys, os, socket, threading, logging, traceback +import sys, os, socket, threading, logging, traceback, time import secsh # setup logging @@ -15,6 +15,19 @@ if len(l.handlers) == 0: host_key = secsh.RSAKey() host_key.read_private_key_file('demo-host-key') + +class ServerTransport(secsh.Transport): + def check_channel_request(self, kind, chanid): + if kind == 'session': + return secsh.Channel(chanid) + return self.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED + + def check_auth_password(self, username, password): + if (username == 'robey') and (password == 'foo'): + return self.AUTH_SUCCESSFUL + return self.AUTH_FAILED + + # now connect try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -35,7 +48,7 @@ except Exception, e: try: event = threading.Event() - t = secsh.Transport(client) + t = ServerTransport(client) t.add_server_key(host_key) t.ultra_debug = 1 t.start_server(event) @@ -45,6 +58,18 @@ try: print '*** SSH negotiation failed.' sys.exit(1) # print repr(t) + + chan = t.accept() + time.sleep(2) + chan.send('\r\n\r\nWelcome to my dorky little BBS!\r\n\r\n') + chan.send('We are on fire all the time! Hooray! Candy corn for everyone!\r\n') + chan.send('Happy birthday to Robot Dave!\r\n\r\n') + chan.send('Username: ') + f = chan.makefile('rU') + username = f.readline().strip('\r\n') + chan.send('\r\nI don\'t like you, ' + username + '.\r\n') + chan.close() + except Exception, e: print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e) traceback.print_exc() |