author | Aurelien Campeas <aurelien.campeas@logilab.fr> |
Fri, 30 May 2014 17:24:44 +0200 | |
changeset 9793 | 52647b05bda8 |
parent 9790 | 0872ac2a1db0 |
child 10024 | 2a08247b57fb |
child 10026 | 621646d5f010 |
permissions | -rw-r--r-- |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
1 |
# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5090
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""Server subcube of cubicweb : defines objects used only on the server |
19 |
(repository) side |
|
20 |
||
7529
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
21 |
The server module contains functions to initialize a new repository. |
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
22 |
""" |
0 | 23 |
|
24 |
__docformat__ = "restructuredtext en" |
|
25 |
||
26 |
import sys |
|
27 |
from os.path import join, exists |
|
2730
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
28 |
from glob import glob |
9148
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
29 |
from contextlib import contextmanager |
0 | 30 |
|
31 |
from logilab.common.modutils import LazyObject |
|
2633
bc9386c3b2c9
get_csv is being renamed to splitstrip
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2631
diff
changeset
|
32 |
from logilab.common.textutils import splitstrip |
8268
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
33 |
from logilab.common.registry import yes |
2730
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
34 |
from yams import BASE_GROUPS |
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
35 |
|
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
36 |
from cubicweb import CW_SOFTWARE_ROOT |
8268
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
37 |
from cubicweb.appobject import AppObject |
2730
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
38 |
|
7573
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
39 |
class ShuttingDown(BaseException): |
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
40 |
"""raised when trying to access some resources while the repository is |
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
41 |
shutting down. Inherit from BaseException so that `except Exception` won't |
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
42 |
catch it. |
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
43 |
""" |
c8f8762c986d
[repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7529
diff
changeset
|
44 |
|
8268
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
45 |
# server-side services ######################################################### |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
46 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
47 |
class Service(AppObject): |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
48 |
"""Base class for services. |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
49 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
50 |
A service is a selectable object that performs an action server-side. |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
51 |
Use :class:`cubicweb.dbapi.Connection.call_service` to call them from |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
52 |
the web-side. |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
53 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
54 |
When inheriting this class, do not forget to define at least the __regid__ |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
55 |
attribute (and probably __select__ too). |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
56 |
""" |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
57 |
__registry__ = 'services' |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
58 |
__select__ = yes() |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
59 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
60 |
def call(self, **kwargs): |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
61 |
raise NotImplementedError |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
62 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
63 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8188
diff
changeset
|
64 |
# server-side debugging ######################################################## |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
65 |
|
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
66 |
# server debugging flags. They may be combined using binary operators. |
7529
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
67 |
|
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
68 |
#:no debug information |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
69 |
DBG_NONE = 0 #: no debug information |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
70 |
#: rql execution information |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
71 |
DBG_RQL = 1 |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
72 |
#: executed sql |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
73 |
DBG_SQL = 2 |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
74 |
#: repository events |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
75 |
DBG_REPO = 4 |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
76 |
#: multi-sources |
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
77 |
DBG_MS = 8 |
8626
e2ba137b2bf9
[server] add debugging for Hooks & Operations (closes #2470048)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8580
diff
changeset
|
78 |
#: hooks |
e2ba137b2bf9
[server] add debugging for Hooks & Operations (closes #2470048)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8580
diff
changeset
|
79 |
DBG_HOOKS = 16 |
e2ba137b2bf9
[server] add debugging for Hooks & Operations (closes #2470048)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8580
diff
changeset
|
80 |
#: operations |
e2ba137b2bf9
[server] add debugging for Hooks & Operations (closes #2470048)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
8580
diff
changeset
|
81 |
DBG_OPS = 32 |
9148
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
82 |
#: security |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
83 |
DBG_SEC = 64 |
7529
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
84 |
#: more verbosity |
9148
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
85 |
DBG_MORE = 128 |
7529
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
86 |
#: all level enabled |
9148
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
87 |
DBG_ALL = DBG_RQL + DBG_SQL + DBG_REPO + DBG_MS + DBG_HOOKS + DBG_OPS + DBG_SEC + DBG_MORE |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
88 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
89 |
_SECURITY_ITEMS = [] |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
90 |
_SECURITY_CAPS = ['read', 'add', 'update', 'delete'] |
7529
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
91 |
|
2fdc310be7cd
[book] add autoload section from code and fix sphinx warnings
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7186
diff
changeset
|
92 |
#: current debug mode |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
93 |
DEBUG = 0 |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
94 |
|
9148
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
95 |
@contextmanager |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
96 |
def tunesecurity(items=(), capabilities=()): |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
97 |
"""Context manager to use in conjunction with DBG_SEC. |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
98 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
99 |
This allows some tuning of: |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
100 |
* the monitored capabilities ('read', 'add', ....) |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
101 |
* the object being checked by the security checkers |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
102 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
103 |
When no item is given, all of them will be watched. |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
104 |
By default all capabilities are monitored, unless specified. |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
105 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
106 |
Example use:: |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
107 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
108 |
from cubicweb.server import debugged, DBG_SEC, tunesecurity |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
109 |
with debugged(DBG_SEC): |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
110 |
with tunesecurity(items=('Elephant', 'trumps'), |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
111 |
capabilities=('update', 'delete')): |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
112 |
babar.cw_set(trumps=celeste) |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
113 |
flore.cw_delete() |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
114 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
115 |
==> |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
116 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
117 |
check_perm: 'update' 'relation Elephant.trumps.Elephant' |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
118 |
[(ERQLExpression(Any X WHERE U has_update_permission X, X eid %(x)s, U eid %(u)s), |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
119 |
{'eid': 2167}, True)] |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
120 |
check_perm: 'delete' 'Elephant' |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
121 |
[(ERQLExpression(Any X WHERE U has_delete_permission X, X eid %(x)s, U eid %(u)s), |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
122 |
{'eid': 2168}, True)] |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
123 |
|
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
124 |
""" |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
125 |
olditems = _SECURITY_ITEMS[:] |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
126 |
_SECURITY_ITEMS.extend(list(items)) |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
127 |
oldactions = _SECURITY_CAPS[:] |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
128 |
_SECURITY_CAPS[:] = capabilities |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
129 |
yield |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
130 |
_SECURITY_ITEMS[:] = olditems |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
131 |
_SECURITY_CAPS[:] = oldactions |
1b549c1acd4f
[schema,server] add a security debugging aid (closes #2920304)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9015
diff
changeset
|
132 |
|
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
133 |
def set_debug(debugmode): |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
134 |
"""change the repository debugging mode""" |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
135 |
global DEBUG |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
136 |
if not debugmode: |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
137 |
DEBUG = 0 |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
138 |
return |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
139 |
if isinstance(debugmode, basestring): |
2633
bc9386c3b2c9
get_csv is being renamed to splitstrip
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2631
diff
changeset
|
140 |
for mode in splitstrip(debugmode, sep='|'): |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
141 |
DEBUG |= globals()[mode] |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
142 |
else: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
143 |
DEBUG |= debugmode |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
144 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
145 |
class debugged(object): |
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
146 |
"""Context manager and decorator to help debug the repository. |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
147 |
|
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
148 |
It can be used either as a context manager: |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
149 |
|
9325
a4fc09836329
[doc] Use string debug mode in debugged docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
8755
diff
changeset
|
150 |
>>> with debugged('DBG_RQL | DBG_REPO'): |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
151 |
... # some code in which you want to debug repository activity, |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
152 |
... # seing information about RQL being executed an repository events. |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
153 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
154 |
or as a function decorator: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
155 |
|
9325
a4fc09836329
[doc] Use string debug mode in debugged docstring
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
8755
diff
changeset
|
156 |
>>> @debugged('DBG_RQL | DBG_REPO') |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
157 |
... def some_function(): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
158 |
... # some code in which you want to debug repository activity, |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
159 |
... # seing information about RQL being executed an repository events |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
160 |
|
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
161 |
The debug mode will be reset to its original value when leaving the "with" |
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
162 |
block or the decorated function. |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
163 |
""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
164 |
def __init__(self, debugmode): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
165 |
self.debugmode = debugmode |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
166 |
self._clevel = None |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
167 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
168 |
def __enter__(self): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
169 |
"""enter with block""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
170 |
self._clevel = DEBUG |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
171 |
set_debug(self.debugmode) |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
172 |
|
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
173 |
def __exit__(self, exctype, exc, traceback): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
174 |
"""leave with block""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
175 |
set_debug(self._clevel) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
176 |
return traceback is None |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
177 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
178 |
def __call__(self, func): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
179 |
"""decorate function""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
180 |
def wrapped(*args, **kwargs): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
181 |
_clevel = DEBUG |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
182 |
set_debug(self.debugmode) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
183 |
try: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
184 |
return func(*args, **kwargs) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
185 |
finally: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
186 |
set_debug(self._clevel) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
187 |
return wrapped |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
188 |
|
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
189 |
# database initialization ###################################################### |
0 | 190 |
|
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
191 |
def create_user(session, login, pwd, *groups): |
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
192 |
# monkey patch this method if you want to customize admin/anon creation |
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
193 |
# (that maybe necessary if you change CWUser's schema) |
4634
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
194 |
user = session.create_entity('CWUser', login=login, upassword=pwd) |
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
195 |
for group in groups: |
4634
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
196 |
session.execute('SET U in_group G WHERE U eid %(u)s, G name %(group)s', |
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
197 |
{'u': user.eid, 'group': group}) |
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
198 |
return user |
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
199 |
|
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
200 |
def init_repository(config, interactive=True, drop=False, vreg=None, |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
201 |
init_config=None): |
0 | 202 |
"""initialise a repository database by creating tables add filling them |
203 |
with the minimal set of entities (ie at least the schema, base groups and |
|
204 |
a initial user) |
|
205 |
""" |
|
9511
241b1232ed7f
Use repoapi instead of dbapi for cwctl shell, upgrade and db-init
Julien Cristau <julien.cristau@logilab.fr>
parents:
9494
diff
changeset
|
206 |
from cubicweb.repoapi import get_repository, connect |
0 | 207 |
from cubicweb.server.repository import Repository |
208 |
from cubicweb.server.utils import manager_userpasswd |
|
8755
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
209 |
from cubicweb.server.sqlutils import sqlexec, sqlschema, sql_drop_all_user_tables |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
210 |
from cubicweb.server.sqlutils import _SQL_DROP_ALL_USER_TABLES_FILTER_FUNCTION as drop_filter |
0 | 211 |
# configuration to avoid db schema loading and user'state checking |
212 |
# on connection |
|
213 |
config.creating = True |
|
214 |
config.consider_user_state = False |
|
8580
d753d6a6798f
[repository] move modification of appobject_path to repository initialization code so we can restore it later to avoid side effect on the config. Fix regression introduced in d32ab8570e5d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8561
diff
changeset
|
215 |
config.cubicweb_appobject_path = set(('hooks', 'entities')) |
d753d6a6798f
[repository] move modification of appobject_path to repository initialization code so we can restore it later to avoid side effect on the config. Fix regression introduced in d32ab8570e5d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8561
diff
changeset
|
216 |
config.cube_appobject_path = set(('hooks', 'entities')) |
6126
aca6a2c357fd
[repository] enabled sources refactoring: to avoid error, we should always have all known source in repo.sources_by_uri and only enabled ones in repo.sources, so we still have access to the definition of temporarily disabled sources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5750
diff
changeset
|
217 |
# only enable the system source at initialization time |
0 | 218 |
repo = Repository(config, vreg=vreg) |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
219 |
if init_config is not None: |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
220 |
# further config initialization once it has been bootstrapped |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9556
diff
changeset
|
221 |
init_config(config) |
0 | 222 |
schema = repo.schema |
9460
a2a0bc984863
[config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9456
diff
changeset
|
223 |
sourcescfg = config.read_sources_file() |
0 | 224 |
source = sourcescfg['system'] |
225 |
driver = source['db-driver'] |
|
226 |
sqlcnx = repo.system_source.get_connection() |
|
227 |
sqlcursor = sqlcnx.cursor() |
|
2306
95da5d9f0870
give session to doexec so it's able to rollback the connection on unexpected error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2172
diff
changeset
|
228 |
execute = sqlcursor.execute |
0 | 229 |
if drop: |
8755
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
230 |
helper = database.get_db_helper(driver) |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
231 |
dropsql = sql_drop_all_user_tables(helper, sqlcursor) |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
232 |
# We may fail dropping some tables because of table dependencies, in a first pass. |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
233 |
# So, we try a second drop sequence to drop remaining tables if needed. |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
234 |
# Note that 2 passes is an arbitrary choice as it seems enougth for our usecases. |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
235 |
# (looping may induce infinite recursion when user have no right for example) |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
236 |
# Here we try to keep code simple and backend independant. That why we don't try to |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
237 |
# distinguish remaining tables (wrong right, dependencies, ...). |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
238 |
failed = sqlexec(dropsql, execute, cnx=sqlcnx, |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
239 |
pbtitle='-> dropping tables (first pass)') |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
240 |
if failed: |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
241 |
failed = sqlexec(failed, execute, cnx=sqlcnx, |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
242 |
pbtitle='-> dropping tables (second pass)') |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
243 |
remainings = filter(drop_filter, helper.list_tables(sqlcursor)) |
1f3757ef3762
[server] *init_repository* lookup the database instead of the schema to drop tables (closes #810743)
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
8695
diff
changeset
|
244 |
assert not remainings, 'Remaining tables: %s' % ', '.join(remainings) |
7906
203d574c8a1d
repaire cctl db-init -d on sqlserver (closes #1979670)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7574
diff
changeset
|
245 |
_title = '-> creating tables ' |
203d574c8a1d
repaire cctl db-init -d on sqlserver (closes #1979670)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7574
diff
changeset
|
246 |
print _title, |
0 | 247 |
# schema entities and relations tables |
248 |
# can't skip entities table even if system source doesn't support them, |
|
249 |
# they are used sometimes by generated sql. Keeping them empty is much |
|
250 |
# simpler than fixing this... |
|
4837
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
251 |
schemasql = sqlschema(schema, driver) |
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
252 |
#skip_entities=[str(e) for e in schema.entities() |
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
253 |
# if not repo.system_source.support_entity(str(e))]) |
9333
22423634d06d
[server/initrepo] show failed sql statements and abort if necessary (closes #3308564)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9325
diff
changeset
|
254 |
failed = sqlexec(schemasql, execute, pbtitle=_title, delimiter=';;') |
22423634d06d
[server/initrepo] show failed sql statements and abort if necessary (closes #3308564)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9325
diff
changeset
|
255 |
if failed: |
22423634d06d
[server/initrepo] show failed sql statements and abort if necessary (closes #3308564)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9325
diff
changeset
|
256 |
print 'The following SQL statements failed. You should check your schema.' |
22423634d06d
[server/initrepo] show failed sql statements and abort if necessary (closes #3308564)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9325
diff
changeset
|
257 |
print failed |
22423634d06d
[server/initrepo] show failed sql statements and abort if necessary (closes #3308564)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9325
diff
changeset
|
258 |
raise Exception('execution of the sql schema failed, you should check your schema') |
0 | 259 |
sqlcursor.close() |
260 |
sqlcnx.commit() |
|
261 |
sqlcnx.close() |
|
9494
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
262 |
with repo.internal_cnx() as cnx: |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
263 |
# insert entity representing the system source |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
264 |
ssource = cnx.create_entity('CWSource', type=u'native', name=u'system') |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
265 |
repo.system_source.eid = ssource.eid |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
266 |
cnx.execute('SET X cw_source X WHERE X eid %(x)s', {'x': ssource.eid}) |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
267 |
# insert base groups and default admin |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
268 |
print '-> inserting default user and default groups.' |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
269 |
try: |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
270 |
login = unicode(sourcescfg['admin']['login']) |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
271 |
pwd = sourcescfg['admin']['password'] |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
272 |
except KeyError: |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
273 |
if interactive: |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
274 |
msg = 'enter login and password of the initial manager account' |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
275 |
login, pwd = manager_userpasswd(msg=msg, confirm=True) |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
276 |
else: |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
277 |
login, pwd = unicode(source['db-user']), source['db-password'] |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
278 |
# sort for eid predicatability as expected in some server tests |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
279 |
for group in sorted(BASE_GROUPS): |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
280 |
cnx.create_entity('CWGroup', name=unicode(group)) |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
281 |
admin = create_user(cnx, login, pwd, 'managers') |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
282 |
cnx.execute('SET X owned_by U WHERE X is IN (CWGroup,CWSource), U eid %(u)s', |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
283 |
{'u': admin.eid}) |
197b7a4ef544
[server] Use internal_cnx instead of internal_session in init_repository
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
284 |
cnx.commit() |
5750
b3bc214cd479
[repo] on repository initialization, properly shutdown intermediary repository
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
285 |
repo.shutdown() |
0 | 286 |
# reloging using the admin user |
287 |
config._cubes = None # avoid assertion error |
|
9511
241b1232ed7f
Use repoapi instead of dbapi for cwctl shell, upgrade and db-init
Julien Cristau <julien.cristau@logilab.fr>
parents:
9494
diff
changeset
|
288 |
repo = get_repository(config=config) |
241b1232ed7f
Use repoapi instead of dbapi for cwctl shell, upgrade and db-init
Julien Cristau <julien.cristau@logilab.fr>
parents:
9494
diff
changeset
|
289 |
with connect(repo, login, password=pwd) as cnx: |
9556
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
290 |
with cnx.security_enabled(False, False): |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
291 |
repo.system_source.eid = ssource.eid # redo this manually |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
292 |
handler = config.migration_handler(schema, interactive=False, |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
293 |
cnx=cnx, repo=repo) |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
294 |
# install additional driver specific sql files |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
295 |
handler.cmd_install_custom_sql_scripts() |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
296 |
for cube in reversed(config.cubes()): |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
297 |
handler.cmd_install_custom_sql_scripts(cube) |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
298 |
# serialize the schema |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
299 |
initialize_schema(config, schema, handler) |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
300 |
# yoo ! |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
301 |
cnx.commit() |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
302 |
repo.system_source.init_creating() |
12ee310541bb
[server/migractions] finish migration to repoapi objects
Julien Cristau <julien.cristau@logilab.fr>
parents:
9555
diff
changeset
|
303 |
cnx.commit() |
4766
162b2b127b15
[test] get a chance to get proper garbage collection when running pytest on whole cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
304 |
repo.shutdown() |
0 | 305 |
# restore initial configuration |
306 |
config.creating = False |
|
307 |
config.consider_user_state = True |
|
8580
d753d6a6798f
[repository] move modification of appobject_path to repository initialization code so we can restore it later to avoid side effect on the config. Fix regression introduced in d32ab8570e5d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8561
diff
changeset
|
308 |
# (drop instance attribute to get back to class attribute) |
d753d6a6798f
[repository] move modification of appobject_path to repository initialization code so we can restore it later to avoid side effect on the config. Fix regression introduced in d32ab8570e5d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8561
diff
changeset
|
309 |
del config.cubicweb_appobject_path |
d753d6a6798f
[repository] move modification of appobject_path to repository initialization code so we can restore it later to avoid side effect on the config. Fix regression introduced in d32ab8570e5d
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8561
diff
changeset
|
310 |
del config.cube_appobject_path |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2458
diff
changeset
|
311 |
print '-> database for instance %s initialized.' % config.appid |
0 | 312 |
|
313 |
||
314 |
def initialize_schema(config, schema, mhandler, event='create'): |
|
315 |
from cubicweb.server.schemaserial import serialize_schema |
|
9511
241b1232ed7f
Use repoapi instead of dbapi for cwctl shell, upgrade and db-init
Julien Cristau <julien.cristau@logilab.fr>
parents:
9494
diff
changeset
|
316 |
cnx = mhandler.cnx |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
317 |
cubes = config.cubes() |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
318 |
# deactivate every hooks but those responsible to set metadata |
5090
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
319 |
# so, NO INTEGRITY CHECKS are done, to have quicker db creation. |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
320 |
# Active integrity is kept else we may pb such as two default |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
321 |
# workflows for one entity type. |
9555
370a7c40864f
[server] use the ClientConnection directly now that it has more methods available
Julien Cristau <julien.cristau@logilab.fr>
parents:
9511
diff
changeset
|
322 |
with cnx.deny_all_hooks_but('metadata', 'activeintegrity'): |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
323 |
# execute cubicweb's pre<event> script |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
324 |
mhandler.cmd_exec_event_script('pre%s' % event) |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
325 |
# execute cubes pre<event> script if any |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
326 |
for cube in reversed(cubes): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
327 |
mhandler.cmd_exec_event_script('pre%s' % event, cube) |
7974
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7915
diff
changeset
|
328 |
# execute instance's pre<event> script (useful in tests) |
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7915
diff
changeset
|
329 |
mhandler.cmd_exec_event_script('pre%s' % event, apphome=True) |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
330 |
# enter instance'schema into the database |
9511
241b1232ed7f
Use repoapi instead of dbapi for cwctl shell, upgrade and db-init
Julien Cristau <julien.cristau@logilab.fr>
parents:
9494
diff
changeset
|
331 |
serialize_schema(cnx, schema) |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
332 |
# execute cubicweb's post<event> script |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
333 |
mhandler.cmd_exec_event_script('post%s' % event) |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
334 |
# execute cubes'post<event> script if any |
7915
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
335 |
for cube in reversed(cubes): |
a7f3245e1728
[migration] expose migration methods to execute schema/*.sql and migration/<event>.py files (closes #1986498)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7574
diff
changeset
|
336 |
mhandler.cmd_exec_event_script('post%s' % event, cube) |
7974
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7915
diff
changeset
|
337 |
# execute instance's post<event> script (useful in tests) |
77eec6d6e144
[test] fix regression introduced in 7915:a7f3245e1728 leading to test's postcreate not being executed anymore
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7915
diff
changeset
|
338 |
mhandler.cmd_exec_event_script('post%s' % event, apphome=True) |
0 | 339 |
|
340 |
||
4831
c5aec27c1bf7
[repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4766
diff
changeset
|
341 |
# sqlite'stored procedures have to be registered at connection opening time |
4848
41f84eea63c9
rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4845
diff
changeset
|
342 |
from logilab.database import SQL_CONNECT_HOOKS |
0 | 343 |
|
344 |
# add to this set relations which should have their add security checking done |
|
345 |
# *BEFORE* adding the actual relation (done after by default) |
|
346 |
BEFORE_ADD_RELATIONS = set(('owned_by',)) |
|
347 |
||
348 |
# add to this set relations which should have their add security checking done |
|
349 |
# *at COMMIT TIME* (done after by default) |
|
350 |
ON_COMMIT_ADD_RELATIONS = set(()) |
|
351 |
||
352 |
# available sources registry |
|
353 |
SOURCE_TYPES = {'native': LazyObject('cubicweb.server.sources.native', 'NativeSQLSource'), |
|
8188
1867e252e487
[repository] ldap-feed source. Closes #2086984
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7979
diff
changeset
|
354 |
'datafeed': LazyObject('cubicweb.server.sources.datafeed', 'DataFeedSource'), |
1867e252e487
[repository] ldap-feed source. Closes #2086984
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7979
diff
changeset
|
355 |
'ldapfeed': LazyObject('cubicweb.server.sources.ldapfeed', 'LDAPFeedSource'), |
0 | 356 |
} |