[91] | 1 | # Copyright (c) 2003-2010 Ralph Meijer |
---|
| 2 | # See LICENSE for details. |
---|
| 3 | |
---|
| 4 | """ |
---|
| 5 | XMPP Component Service. |
---|
| 6 | |
---|
| 7 | This provides an XMPP server that accepts External Components connections |
---|
| 8 | and accepts and initiates server-to-server connections for the specified |
---|
| 9 | domain(s). |
---|
| 10 | """ |
---|
| 11 | |
---|
| 12 | from twisted.application import service, strports |
---|
| 13 | from twisted.python import usage |
---|
| 14 | from twisted.words.protocols.jabber import component |
---|
| 15 | from wokkel import server |
---|
| 16 | |
---|
| 17 | class Options(usage.Options): |
---|
| 18 | |
---|
| 19 | optParameters = [ |
---|
| 20 | ('component-port', None, 'tcp:5347:interface=127.0.0.1', |
---|
| 21 | 'Port components connect to'), |
---|
| 22 | ('component-secret', None, 'secret', |
---|
| 23 | 'Secret components use to connect'), |
---|
| 24 | ('server-port', None, 'tcp:5269', |
---|
| 25 | 'Port other servers connect to'), |
---|
| 26 | ('server-secret', None, None, |
---|
| 27 | 'Shared secret for dialback verification'), |
---|
| 28 | ] |
---|
| 29 | |
---|
| 30 | optFlags = [ |
---|
| 31 | ('verbose', 'v', 'Log traffic'), |
---|
| 32 | ] |
---|
| 33 | |
---|
| 34 | def __init__(self): |
---|
| 35 | usage.Options.__init__(self) |
---|
| 36 | self['domains'] = set() |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | def opt_domain(self, domain): |
---|
| 40 | """ |
---|
| 41 | Domain to accept server connections for. Repeat for more domains. |
---|
| 42 | """ |
---|
| 43 | self['domains'].add(domain) |
---|
| 44 | |
---|
| 45 | |
---|
| 46 | def postOptions(self): |
---|
| 47 | if not self['domains']: |
---|
| 48 | raise usage.UsageError('Need at least one domain') |
---|
| 49 | |
---|
| 50 | |
---|
| 51 | |
---|
| 52 | def makeService(config): |
---|
| 53 | s = service.MultiService() |
---|
| 54 | |
---|
| 55 | router = component.Router() |
---|
| 56 | |
---|
| 57 | # Set up the XMPP server service |
---|
| 58 | |
---|
| 59 | serverService = server.ServerService(router, secret=config['server-secret']) |
---|
| 60 | serverService.domains = config['domains'] |
---|
| 61 | serverService.logTraffic = config['verbose'] |
---|
| 62 | |
---|
| 63 | # Hook up XMPP server-to-server service |
---|
| 64 | s2sFactory = server.XMPPS2SServerFactory(serverService) |
---|
| 65 | s2sFactory.logTraffic = config['verbose'] |
---|
| 66 | s2sService = strports.service(config['server-port'], s2sFactory) |
---|
| 67 | s2sService.setServiceParent(s) |
---|
| 68 | |
---|
| 69 | # Hook up XMPP external server-side component service |
---|
| 70 | cFactory = component.XMPPComponentServerFactory(router, |
---|
| 71 | config['component-secret']) |
---|
| 72 | |
---|
| 73 | cFactory.logTraffic = config['verbose'] |
---|
| 74 | cServer = strports.service(config['component-port'], cFactory) |
---|
| 75 | cServer.setServiceParent(s) |
---|
| 76 | |
---|
| 77 | return s |
---|