annotate twisted/plugins/pubsub.py @ 414:ccb2a22ea0fc

Python 3 port: /!\ Python 3.6+ is now needed to use SàT Pubsub /!\ instability may occur and features may not be working anymore, this will improve with time The same procedure as in backend has been applied (check backend commit ab2696e34d29 logs for details). Python minimal version has been updated in setup.py
author Goffi <goffi@goffi.org>
date Fri, 16 Aug 2019 12:53:33 +0200
parents a58610ab2983
children 412d26a9b2c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
1 #!/usr/bin/env python3
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
2 #-*- coding: utf-8 -*-
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
3
384
aa3a464df605 dates update
Goffi <goffi@goffi.org>
parents: 382
diff changeset
4 # Copyright (c) 2012-2019 Jérôme Poisson
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
5 # Copyright (c) 2003-2011 Ralph Meijer
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
6
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
7
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
8 # This program is free software: you can redistribute it and/or modify
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
11 # (at your option) any later version.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
12
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
13 # This program is distributed in the hope that it will be useful,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
16 # GNU Affero General Public License for more details.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
17
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
20 # --
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
21
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
22 # This program is based on Idavoll (http://idavoll.ik.nu/),
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
23 # originaly written by Ralph Meijer (http://ralphm.net/blog/)
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
24 # It is sublicensed under AGPL v3 (or any later version) as allowed by the original
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
25 # license.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
26
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
27 # --
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
28
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
29 # Here is a copy of the original license:
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
30
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
31 # Copyright (c) 2003-2011 Ralph Meijer
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
32
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
33 # Permission is hereby granted, free of charge, to any person obtaining
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
34 # a copy of this software and associated documentation files (the
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
35 # "Software"), to deal in the Software without restriction, including
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
36 # without limitation the rights to use, copy, modify, merge, publish,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
37 # distribute, sublicense, and/or sell copies of the Software, and to
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
38 # permit persons to whom the Software is furnished to do so, subject to
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
39 # the following conditions:
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
40
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
41 # The above copyright notice and this permission notice shall be
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
42 # included in all copies or substantial portions of the Software.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
43
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
44 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
45 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
46 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
47 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
48 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
49 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
50 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 192
diff changeset
51
155
5191ba7c4df8 Work towards first release 0.5.0.
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
52
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
53 import csv
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
54 import sat_pubsub
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
55 import sys
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
56 from twisted.application.service import IServiceMaker
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
57 from twisted.application import service
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
58 from twisted.python import usage, log
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
59 from twisted.words.protocols.jabber.jid import JID
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
60 from twisted.plugin import IPlugin
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
61
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
62 from wokkel.component import Component
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
63 from wokkel.disco import DiscoHandler
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
64 from wokkel.generic import FallbackHandler, VersionHandler
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
65 from wokkel.iwokkel import IPubSubResource
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
66 from wokkel import data_form
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
67 from wokkel import pubsub
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
68 from wokkel import rsm
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
69 from wokkel import mam
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
70 from zope.interface import implementer
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
71
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
72 from sat_pubsub import const
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
73 from sat_pubsub import mam as pubsub_mam
382
77b52dbda89a pubsub_admin: Pubsub Admin experimental protocol first draft:
Goffi <goffi@goffi.org>
parents: 380
diff changeset
74 from sat_pubsub import pubsub_admin
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
75 from sat_pubsub.backend import BackendService, ExtraDiscoHandler
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
76 from sat_pubsub.schema import SchemaHandler
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
77 from sat_pubsub.privilege import PrivilegesHandler
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
78 from sat_pubsub.delegation import DelegationsHandler
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
79 from os.path import expanduser, realpath
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
80 import configparser
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
81
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
82
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
83 def coerceListType(value):
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
84 return next(csv.reader(
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
85 [value], delimiter=",", quotechar='"', skipinitialspace=True
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
86 ))
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
87
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
88
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
89 def coerceJidListType(value):
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
90 values = [JID(v) for v in coerceListType(value)]
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
91 if any((j.resource for j in values)):
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
92 raise ValueError("you must use bare jids")
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
93 return values
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
94
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
95
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
96
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
97 OPT_PARAMETERS_BOTH = [
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
98 ['jid', None, None, 'JID this component will be available at'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
99 ['xmpp_pwd', None, None, 'XMPP server component password'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
100 ['rhost', None, '127.0.0.1', 'XMPP server host'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
101 ['rport', None, '5347', 'XMPP server port'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
102 ['backend', None, 'pgsql', 'Choice of storage backend'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
103 ['db_user', None, None, 'Database user (pgsql backend)'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
104 ['db_name', None, 'pubsub', 'Database name (pgsql backend)'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
105 ['db_pass', None, None, 'Database password (pgsql backend)'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
106 ['db_host', None, None, 'Database host (pgsql backend)'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
107 ['db_port', None, None, 'Database port (pgsql backend)'],
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
108 ]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
109 # here for future use
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
110 OPT_PARAMETERS_CFG = [
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
111 ["admins_jids_list", None, [], "List of administrators' bare jids",
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
112 coerceJidListType]
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
113 ]
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
114
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
115 CONFIG_FILENAME = 'sat'
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
116 # List of the configuration filenames sorted by ascending priority
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
117 CONFIG_FILES = [realpath(expanduser(path) + CONFIG_FILENAME + '.conf') for path in (
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
118 '/etc/', '/etc/{}/'.format(CONFIG_FILENAME),
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
119 '~/', '~/.',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
120 '.config/', '.config/.',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
121 '', '.')]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
122 CONFIG_SECTION = 'pubsub'
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
123
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
124
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
125 class Options(usage.Options):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
126 optParameters = OPT_PARAMETERS_BOTH
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
127
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
128 optFlags = [
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
129 ('verbose', 'v', 'Show traffic'),
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
130 ('hide-nodes', None, 'Hide all nodes for disco')
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
131 ]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
132
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
133 def __init__(self):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
134 """Read SàT Pubsub configuration file in order to overwrite the hard-coded default values.
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
135
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
136 Priority for the usage of the values is (from lowest to highest):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
137 - hard-coded default values
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
138 - values from SàT configuration files
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
139 - values passed on the command line
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
140 """
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
141 # If we do it the reading later: after the command line options have been parsed, there's no good way to know
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
142 # if the options values are the hard-coded ones or if they have been passed on the command line.
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
143
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
144 # FIXME: must be refactored + code can be factorised with backend
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
145 config_parser = configparser.ConfigParser()
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
146 config_parser.read(CONFIG_FILES)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
147 for param in self.optParameters + OPT_PARAMETERS_CFG:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
148 name = param[0]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
149 try:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
150 value = config_parser.get(CONFIG_SECTION, name)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
151 try:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
152 param[2] = param[4](value)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
153 except IndexError: # the coerce method is optional
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
154 param[2] = value
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
155 except Exception as e:
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
156 log.err('Invalid value for setting "{name}": {msg}'.format(
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
157 name=name, msg=e))
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
158 sys.exit(1)
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
159 except (configparser.NoSectionError, configparser.NoOptionError):
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
160 pass
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
161 usage.Options.__init__(self)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
162 for opt_data in OPT_PARAMETERS_CFG:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
163 self[opt_data[0]] = opt_data[2]
155
5191ba7c4df8 Work towards first release 0.5.0.
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
164
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
165 def postOptions(self):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
166 if self['backend'] not in ['pgsql', 'memory']:
406
a58610ab2983 removed old code:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
167 raise usage.UsageError("Unknown backend!")
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
168 if self['backend'] == 'memory':
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
169 raise NotImplementedError('memory backend is not available at the moment')
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
170
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
171 self['jid'] = JID(self['jid']) if self['jid'] else None
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
172
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
173
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
174 @implementer(IServiceMaker, IPlugin)
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
175 class SatPubsubMaker(object):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
176 tapname = "sat-pubsub"
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
177 description = "Salut à Toi Publish-Subscribe Service Component"
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
178 options = Options
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
179
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
180 def makeService(self, config):
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
181 if not config['jid'] or not config['xmpp_pwd']:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
182 raise usage.UsageError("You must specify jid and xmpp_pwd")
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
183 s = service.MultiService()
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
184
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
185 # Create backend service with storage
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
186
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
187 if config['backend'] == 'pgsql':
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
188 from twisted.enterprise import adbapi
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
189 from sat_pubsub.pgsql_storage import Storage
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
190 from psycopg2.extras import NamedTupleConnection
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
191 keys_map = {
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
192 'db_user': 'user',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
193 'db_pass': 'password',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
194 'db_name': 'database',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
195 'db_host': 'host',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
196 'db_port': 'port',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
197 }
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
198 kwargs = {}
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
199 for config_k, k in keys_map.items():
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
200 v = config.get(config_k)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
201 if v is None:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
202 continue
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
203 kwargs[k] = v
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
204 dbpool = adbapi.ConnectionPool('psycopg2',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
205 cp_reconnect=True,
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
206 client_encoding='utf-8',
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
207 connection_factory=NamedTupleConnection,
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
208 **kwargs
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
209 )
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
210 st = Storage(dbpool)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
211 elif config['backend'] == 'memory':
406
a58610ab2983 removed old code:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
212 raise NotImplementedError('memory backend is not available at the moment')
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
213
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 375
diff changeset
214 bs = BackendService(st, config)
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
215 bs.setName('backend')
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
216 bs.setServiceParent(s)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
217
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
218 # Set up XMPP server-side component with publish-subscribe capabilities
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
219
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
220 cs = Component(config["rhost"], int(config["rport"]),
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
221 config["jid"].full(), config["xmpp_pwd"])
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
222 cs.setName('component')
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
223 cs.setServiceParent(s)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
224
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
225 cs.factory.maxDelay = 900
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
226
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
227 if config["verbose"]:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
228 cs.logTraffic = True
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
229
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
230 FallbackHandler().setHandlerParent(cs)
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 406
diff changeset
231 VersionHandler('SàT Pubsub', sat_pubsub.__version__).setHandlerParent(cs)
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
232 DiscoHandler().setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
233
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
234 ph = PrivilegesHandler(config['jid'])
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
235 ph.setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
236 bs.privilege = ph
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
237
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
238 resource = IPubSubResource(bs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
239 resource.hideNodes = config["hide-nodes"]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
240 resource.serviceJID = config["jid"]
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
241
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
242 ps = (rsm if const.FLAG_ENABLE_RSM else pubsub).PubSubService(resource)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
243 ps.setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
244 resource.pubsubService = ps
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
245
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
246 if const.FLAG_ENABLE_MAM:
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
247 mam_resource = pubsub_mam.MAMResource(bs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
248 mam_s = mam.MAMService(mam_resource)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
249 mam_s.addFilter(data_form.Field(var=const.MAM_FILTER_CATEGORY))
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
250 mam_s.setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
251
382
77b52dbda89a pubsub_admin: Pubsub Admin experimental protocol first draft:
Goffi <goffi@goffi.org>
parents: 380
diff changeset
252 pa = pubsub_admin.PubsubAdminHandler(bs)
77b52dbda89a pubsub_admin: Pubsub Admin experimental protocol first draft:
Goffi <goffi@goffi.org>
parents: 380
diff changeset
253 pa.setHandlerParent(cs)
77b52dbda89a pubsub_admin: Pubsub Admin experimental protocol first draft:
Goffi <goffi@goffi.org>
parents: 380
diff changeset
254
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
255 sh = SchemaHandler()
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
256 sh.setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
257
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
258 # wokkel.pubsub doesn't handle non pubsub# disco
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
259 # and we need to announce other feature, so this is a workaround
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
260 # to add them
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
261 # FIXME: propose a patch upstream to fix this situation
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
262 ed = ExtraDiscoHandler()
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
263 ed.setHandlerParent(cs)
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
264
369
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
265 # XXX: delegation must be instancied at the end,
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
266 # because it does some MonkeyPatching on handlers
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
267 dh = DelegationsHandler()
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
268 dh.setHandlerParent(cs)
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
269 bs.delegation = dh
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
270
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
271 return s
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
272
dabee42494ac config file + cleaning:
Goffi <goffi@goffi.org>
parents: 368
diff changeset
273 serviceMaker = SatPubsubMaker()