2
from twisted.application import internet, service
3
from twisted.internet import defer, protocol, reactor
4
from twisted.protocols import basic
5
from twisted.python import components
6
from zope.interface import Interface, implements
10
return "Internal error in server"
12
class IFingerService(Interface):
15
"""Return a deferred returning a string"""
18
"""Return a deferred returning a list of strings"""
21
class IFingerFactory(Interface):
24
"""Return a deferred returning a string"""
26
def buildProtocol(addr):
27
"""Return a protocol returning a string"""
29
class FingerProtocol(basic.LineReceiver):
31
def lineReceived(self, user):
32
d = self.factory.getUser(user)
33
d.addErrback(catchError)
34
def writeValue(value):
35
self.transport.write(value)
36
self.transport.loseConnection()
37
d.addCallback(writeValue)
41
class FingerFactoryFromService(protocol.ClientFactory):
43
implements(IFingerFactory)
45
protocol = FingerProtocol
47
def __init__(self, service):
48
self.service = service
50
def getUser(self, user):
51
return self.service.getUser(user)
54
components.registerAdapter(FingerFactoryFromService,
58
class FingerClient(protocol.Protocol):
60
def connectionMade(self):
61
self.transport.write(self.factory.user+"\r\n")
64
def dataReceived(self, data):
67
def connectionLost(self, reason):
68
self.factory.gotData(''.join(self.buf))
70
class FingerClientFactory(protocol.ClientFactory):
72
protocol = FingerClient
74
def __init__(self, user):
76
self.d = defer.Deferred()
78
def clientConnectionFailed(self, _, reason):
79
self.d.errback(reason)
81
def gotData(self, data):
85
def finger(user, host, port=79):
86
f = FingerClientFactory(user)
87
reactor.connectTCP(host, port, f)
91
class ProxyFingerService(service.Service):
92
implements(IFingerService)
94
def getUser(self, user):
96
user, host = user.split('@', 1)
100
ret = finger(user, host)
101
ret.addErrback(lambda _: "Could not connect to remote host")
105
return defer.succeed([])
107
application = service.Application('finger', uid=1, gid=1)
108
f = ProxyFingerService()
109
internet.TCPServer(7779, IFingerFactory(f)).setServiceParent(
110
service.IServiceCollection(application))