1 # -*- coding: latin-1 -*-
3 # Copyright (C) AB Strakt
4 # Copyright (C) Jean-Paul Calderone
5 # See LICENSE for details.
8 Simple echo server, using nonblocking I/O
11 from OpenSSL import SSL
12 import sys, os, select, socket
15 def verify_cb(conn, cert, errnum, depth, ok):
16 # This obviously has to be updated
17 print 'Got certificate: %s' % cert.get_subject()
21 print 'Usage: python[2] server.py PORT'
24 dir = os.path.dirname(sys.argv[0])
29 ctx = SSL.Context(SSL.SSLv23_METHOD)
30 ctx.set_options(SSL.OP_NO_SSLv2)
31 ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb) # Demand a certificate
32 ctx.use_privatekey_file (os.path.join(dir, 'server.pkey'))
33 ctx.use_certificate_file(os.path.join(dir, 'server.cert'))
34 ctx.load_verify_locations(os.path.join(dir, 'CA.cert'))
37 server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
38 server.bind(('', int(sys.argv[1])))
45 def dropClient(cli, errors=None):
47 print 'Client %s left unexpectedly:' % (clients[cli],)
50 print 'Client %s left politely' % (clients[cli],)
52 if writers.has_key(cli):
60 r,w,_ = select.select([server]+clients.keys(), writers.keys(), [])
66 cli,addr = server.accept()
67 print 'Connection from %s' % (addr,)
73 except (SSL.WantReadError, SSL.WantWriteError, SSL.WantX509LookupError):
75 except SSL.ZeroReturnError:
77 except SSL.Error, errors:
78 dropClient(cli, errors)
80 if not writers.has_key(cli):
82 writers[cli] = writers[cli] + ret
86 ret = cli.send(writers[cli])
87 except (SSL.WantReadError, SSL.WantWriteError, SSL.WantX509LookupError):
89 except SSL.ZeroReturnError:
91 except SSL.Error, errors:
92 dropClient(cli, errors)
94 writers[cli] = writers[cli][ret:]
95 if writers[cli] == '':
98 for cli in clients.keys():