summaryrefslogtreecommitdiffhomepage
path: root/demo-server.py
diff options
context:
space:
mode:
authorRobey Pointer <robey@lag.net>2003-11-09 21:14:21 +0000
committerRobey Pointer <robey@lag.net>2003-11-09 21:14:21 +0000
commit5a4871439498fdd0cb8ea391852fc604470b2668 (patch)
tree497430ed3d15e634267805fe14eca98cd158b402 /demo-server.py
parent79fecc456499cc12e56e373871991cf804468a9d (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-xdemo-server.py29
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()