annotate libervia/server/session_iface.py @ 1479:095e94ca6728

pages: disable CSRF token check when service profile is used: CSRF token check doesn't make sense when no user is logged in, and it causes trouble for caching. fix 400
author Goffi <goffi@goffi.org>
date Fri, 22 Oct 2021 16:04:23 +0200
parents 822bd0139769
children 409d10211b20
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1239
f511f8fbbf8a fixed shebangs
Goffi <goffi@goffi.org>
parents: 1237
diff changeset
1 #!/usr/bin/env python3
f511f8fbbf8a fixed shebangs
Goffi <goffi@goffi.org>
parents: 1237
diff changeset
2
1270
6dfcdbeb0d33 pages: handle themes using `theme` request argument
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
3 # Libervia: a SàT frontend
1396
822bd0139769 date update
Goffi <goffi@goffi.org>
parents: 1322
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
5
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
10
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
15
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
18 from zope.interface import Interface, Attribute
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
19 from zope.interface import implementer
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 964
diff changeset
20 from libervia.server.constants import Const as C
1186
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
21 from libervia.server.classes import Notification
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
22 from collections import OrderedDict
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 964
diff changeset
23 import os.path
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
24 import shortuuid
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
25 import time
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
26
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1101
diff changeset
27 FLAGS_KEY = "_flags"
1186
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
28 NOTIFICATIONS_KEY = "_notifications"
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
29 MAX_CACHE_AFFILIATIONS = 100 # number of nodes to keep in cache
960
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
30
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1101
diff changeset
31
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
32 class ISATSession(Interface):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
33 profile = Attribute("Sat profile")
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
34 jid = Attribute("JID associated with the profile")
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
35 uuid = Attribute("uuid associated with the profile session")
947
92f0eeb6dc72 pages: cache identities identities in session + get identities for comments in blog
Goffi <goffi@goffi.org>
parents: 919
diff changeset
36 identities = Attribute("Identities of XMPP entities")
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
37
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
38
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
39 @implementer(ISATSession)
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
40 class SATSession(object):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
41
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
42 def __init__(self, session):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
43 self.profile = None
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
44 self.jid = None
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
45 self.started = time.time()
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
46 # time when the backend session was started
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
47 self.backend_started = None
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
48 self.uuid = str(shortuuid.uuid())
1322
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
49 self.identities = {}
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
50 self.csrf_token = str(shortuuid.uuid())
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
51 self.locale = None # i18n of the pages
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1270
diff changeset
52 self.theme = None
960
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
53 self.pages_data = {} # used to keep data accross reloads (key is page instance)
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
54 self.affiliations = OrderedDict() # cache for node affiliations
960
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
55
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 964
diff changeset
56 @property
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 964
diff changeset
57 def cache_dir(self):
1055
c2037b44f84e server: fixed cache_dir for service profile in session interface
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
58 if self.profile is None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
59 return self.service_cache_url + "/"
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
60 return os.path.join("/", C.CACHE_DIR, self.uuid) + "/"
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 964
diff changeset
61
1094
8a270f32de81 server (session): new "connected" property, which is True when a user is logged
Goffi <goffi@goffi.org>
parents: 1093
diff changeset
62 @property
8a270f32de81 server (session): new "connected" property, which is True when a user is logged
Goffi <goffi@goffi.org>
parents: 1093
diff changeset
63 def connected(self):
8a270f32de81 server (session): new "connected" property, which is True when a user is logged
Goffi <goffi@goffi.org>
parents: 1093
diff changeset
64 return self.profile is not None
8a270f32de81 server (session): new "connected" property, which is True when a user is logged
Goffi <goffi@goffi.org>
parents: 1093
diff changeset
65
1101
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
66 @property
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
67 def guest(self):
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
68 """True if this is a guest session"""
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
69 if self.profile is None:
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
70 return False
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
71 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1101
diff changeset
72 return self.profile.startswith("guest@@")
1101
9f7a628ce893 server (session): new "guest" property, True when connected user is a guest
Goffi <goffi@goffi.org>
parents: 1094
diff changeset
73
960
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
74 def getPageData(self, page, key):
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
75 """get session data for a page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
76
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
77 @param page(LiberviaPage): instance of the page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
78 @param key(object): data key
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
79 return (None, object): value of the key
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
80 None if not found or page_data doesn't exist
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
81 """
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
82 return self.pages_data.get(page, {}).get(key)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
83
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
84 def popPageData(self, page, key, default=None):
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
85 """like getPageData, but remove key once value is gotten
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
86
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
87 @param page(LiberviaPage): instance of the page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
88 @param key(object): data key
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
89 @param default(object): value to return if key is not found
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
90 @return (object): found value or default
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
91 """
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
92 page_data = self.pages_data.get(page)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
93 if page_data is None:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
94 return default
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
95 value = page_data.pop(key, default)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
96 if not page_data:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
97 # no need to keep unused page_data
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
98 del self.pages_data[page]
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
99 return value
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
100
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
101 def setPageData(self, page, key, value):
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
102 """set data to persist on reload
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
103
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
104 @param page(LiberviaPage): instance of the page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
105 @param key(object): data key
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
106 @param value(object): value to set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
107 @return (object): set value
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
108 """
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
109 page_data = self.pages_data.setdefault(page, {})
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
110 page_data[key] = value
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
111 return value
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
112
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
113 def setPageFlag(self, page, flag):
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
114 """set a flag for this page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
115
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
116 @param page(LiberviaPage): instance of the page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
117 @param flag(unicode): flag to set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
118 """
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
119 flags = self.getPageData(page, FLAGS_KEY)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
120 if flags is None:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
121 flags = self.setPageData(page, FLAGS_KEY, set())
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
122 flags.add(flag)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
123
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
124 def popPageFlag(self, page, flag):
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
125 """return True if flag is set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
126
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
127 flag is removed if it was set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
128 @param page(LiberviaPage): instance of the page
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
129 @param flag(unicode): flag to set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
130 @return (bool): True if flaag was set
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
131 """
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
132 page_data = self.pages_data.get(page, {})
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
133 flags = page_data.get(FLAGS_KEY)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
134 if flags is None:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
135 return False
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
136 if flag in flags:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
137 flags.remove(flag)
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
138 # we remove data if they are not used anymore
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
139 if not flags:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
140 del page_data[FLAGS_KEY]
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
141 if not page_data:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
142 del self.pages_data[page]
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
143 return True
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
144 else:
e59edcae4c18 pages(session): added method to handle reload resistant page specific data:
Goffi <goffi@goffi.org>
parents: 957
diff changeset
145 return False
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
146
1186
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
147 def setPageNotification(self, page, message, level=C.LVL_INFO):
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
148 """set a flag for this page
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
149
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
150 @param page(LiberviaPage): instance of the page
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
151 @param flag(unicode): flag to set
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
152 """
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
153 notif = Notification(message, level)
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
154 notifs = self.getPageData(page, NOTIFICATIONS_KEY)
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
155 if notifs is None:
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
156 notifs = self.setPageData(page, NOTIFICATIONS_KEY, [])
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
157 notifs.append(notif)
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
158
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
159 def popPageNotifications(self, page):
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
160 """Return and remove last page notification
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
161
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
162 @param page(LiberviaPage): instance of the page
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
163 @return (list[Notification]): notifications if any
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
164 """
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
165 page_data = self.pages_data.get(page, {})
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
166 notifs = page_data.get(NOTIFICATIONS_KEY)
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
167 if not notifs:
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
168 return []
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
169 ret = notifs[:]
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
170 del notifs[:]
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
171 return ret
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
172
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
173 def getAffiliation(self, service, node):
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
174 """retrieve affiliation for a pubsub node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
175
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
176 @param service(jid.JID): pubsub service
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
177 @param node(unicode): pubsub node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
178 @return (unicode, None): affiliation, or None if it is not in cache
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
179 """
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
180 if service.resource:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
181 raise ValueError("Service must not have a resource")
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
182 if not node:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
183 raise ValueError("node must be set")
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
184 try:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
185 affiliation = self.affiliations.pop((service, node))
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
186 except KeyError:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
187 return None
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
188 else:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
189 # we replace at the top to get the most recently used on top
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
190 # so less recently used will be removed if cache is full
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
191 self.affiliations[(service, node)] = affiliation
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
192 return affiliation
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
193
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
194 def setAffiliation(self, service, node, affiliation):
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
195 """cache affiliation for a node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
196
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
197 will empty cache when it become too big
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
198 @param service(jid.JID): pubsub service
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
199 @param node(unicode): pubsub node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
200 @param affiliation(unicode): affiliation to this node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
201 """
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
202 if service.resource:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
203 raise ValueError("Service must not have a resource")
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
204 if not node:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
205 raise ValueError("node must be set")
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
206 self.affiliations[(service, node)] = affiliation
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
207 while len(self.affiliations) > MAX_CACHE_AFFILIATIONS:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
208 self.affiliations.popitem(last=False)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
209
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
210
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
211 class ISATGuestSession(Interface):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
212 id = Attribute("UUID of the guest")
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
213 data = Attribute("data associated with the guest")
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
214
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
215
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
216 @implementer(ISATGuestSession)
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
217 class SATGuestSession(object):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
218
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
219 def __init__(self, session):
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
220 self.id = None
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents:
diff changeset
221 self.data = None