~pablo-elenya/exaile/diacritica

« back to all changes in this revision

Viewing changes to plugins/gcalc/gdata/tlslite/integration/TLSSocketServerMixIn.py

  • Committer: Pablo Ruiz Múzquiz
  • Date: 2010-01-11 19:53:01 UTC
  • Revision ID: pruiz@ubuntuvm-20100111195301-pm1d2ppe36gytu77
initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""TLS Lite + SocketServer."""
 
2
 
 
3
from gdata.tlslite.TLSConnection import TLSConnection
 
4
 
 
5
class TLSSocketServerMixIn:
 
6
    """
 
7
    This class can be mixed in with any L{SocketServer.TCPServer} to
 
8
    add TLS support.
 
9
 
 
10
    To use this class, define a new class that inherits from it and
 
11
    some L{SocketServer.TCPServer} (with the mix-in first). Then
 
12
    implement the handshake() method, doing some sort of server
 
13
    handshake on the connection argument.  If the handshake method
 
14
    returns True, the RequestHandler will be triggered.  Below is a
 
15
    complete example of a threaded HTTPS server::
 
16
 
 
17
        from SocketServer import *
 
18
        from BaseHTTPServer import *
 
19
        from SimpleHTTPServer import *
 
20
        from tlslite.api import *
 
21
 
 
22
        s = open("./serverX509Cert.pem").read()
 
23
        x509 = X509()
 
24
        x509.parse(s)
 
25
        certChain = X509CertChain([x509])
 
26
 
 
27
        s = open("./serverX509Key.pem").read()
 
28
        privateKey = parsePEMKey(s, private=True)
 
29
 
 
30
        sessionCache = SessionCache()
 
31
 
 
32
        class MyHTTPServer(ThreadingMixIn, TLSSocketServerMixIn,
 
33
                           HTTPServer):
 
34
          def handshake(self, tlsConnection):
 
35
              try:
 
36
                  tlsConnection.handshakeServer(certChain=certChain,
 
37
                                                privateKey=privateKey,
 
38
                                                sessionCache=sessionCache)
 
39
                  tlsConnection.ignoreAbruptClose = True
 
40
                  return True
 
41
              except TLSError, error:
 
42
                  print "Handshake failure:", str(error)
 
43
                  return False
 
44
 
 
45
        httpd = MyHTTPServer(('localhost', 443), SimpleHTTPRequestHandler)
 
46
        httpd.serve_forever()
 
47
    """
 
48
 
 
49
 
 
50
    def finish_request(self, sock, client_address):
 
51
        tlsConnection = TLSConnection(sock)
 
52
        if self.handshake(tlsConnection) == True:
 
53
            self.RequestHandlerClass(tlsConnection, client_address, self)
 
54
            tlsConnection.close()
 
55
 
 
56
    #Implement this method to do some form of handshaking.  Return True
 
57
    #if the handshake finishes properly and the request is authorized.
 
58
    def handshake(self, tlsConnection):
 
59
        raise NotImplementedError()