summaryrefslogtreecommitdiffhomepage
path: root/demo_server.py
diff options
context:
space:
mode:
authorRobey Pointer <robey@lag.net>2003-11-10 04:54:02 +0000
committerRobey Pointer <robey@lag.net>2003-11-10 04:54:02 +0000
commitaad7b859f194451a0529c4d8aa20cdc724ae33a2 (patch)
tree24b19c05626e547f3f3bc4a12c7a8c64578dbed5 /demo_server.py
parent0e1ef2c65c80bd76eb62f5dfd953cb987d36ce3a (diff)
[project @ Arch-1:robey@lag.net--2003-public%secsh--dev--1.0--patch-7]
cleaned up server code, renamed some files & classes renamed demo-server.py and demo-host-key to demo_server.py and demo_host_key, just to be consistent. renamed SSHException -> SecshException. generalized the mechanism where Channel decides whether to allow different channel requests: 4 of the main ones (pty, window-change, shell, and subsystem) go through easily override-able methods now. you could probably make an actual ssh shell server. gave ChannelFile a repr(). turned off ultra debugging in the demos. demo_server creates a subclass of Channel to allow pty/shell and sets an event when the shell request is made, so that it knows when it can start sending the fake bbs. renamed to charmander and updated some of the distutils files.
Diffstat (limited to 'demo_server.py')
-rwxr-xr-xdemo_server.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/demo_server.py b/demo_server.py
new file mode 100755
index 00000000..a4cf01c8
--- /dev/null
+++ b/demo_server.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+
+import sys, os, socket, threading, logging, traceback
+import secsh
+
+# setup logging
+l = logging.getLogger("secsh")
+l.setLevel(logging.DEBUG)
+if len(l.handlers) == 0:
+ f = open('demo_server.log', 'w')
+ lh = logging.StreamHandler(f)
+ lh.setFormatter(logging.Formatter('%(levelname)-.3s [%(asctime)s] %(name)s: %(message)s', '%Y%m%d:%H%M%S'))
+ l.addHandler(lh)
+
+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 ServerChannel(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
+
+class ServerChannel(secsh.Channel):
+ "Channel descendant that pretends to understand pty and shell requests"
+
+ def __init__(self, chanid):
+ secsh.Channel.__init__(self, chanid)
+ self.event = threading.Event()
+
+ def check_pty_request(self, term, width, height, pixelwidth, pixelheight, modes):
+ return True
+
+ def check_shell_request(self):
+ self.event.set()
+ return True
+
+
+# now connect
+try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock.bind(('', 2200))
+except Exception, e:
+ print '*** Bind failed: ' + str(e)
+ traceback.print_exc()
+ sys.exit(1)
+
+try:
+ sock.listen(100)
+ client, addr = sock.accept()
+except Exception, e:
+ print '*** Listen/accept failed: ' + str(e)
+ traceback.print_exc()
+ sys.exit(1)
+
+try:
+ event = threading.Event()
+ t = ServerTransport(client)
+ t.add_server_key(host_key)
+ t.ultra_debug = 0
+ t.start_server(event)
+ # print repr(t)
+ event.wait(10)
+ if not t.is_active():
+ print '*** SSH negotiation failed.'
+ sys.exit(1)
+ # print repr(t)
+
+ chan = t.accept()
+ chan.event.wait(10)
+ if not chan.event.isSet():
+ print '*** Client never asked for a shell.'
+ sys.exit(1)
+
+ 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()
+ try:
+ t.close()
+ except:
+ pass
+ sys.exit(1)
+