root / pithos / backends / lib / sqlalchemy / permissions.py @ e83f9467
History | View | Annotate | Download (5.4 kB)
1 | 4f917833 | Sofia Papagiannaki | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 4f917833 | Sofia Papagiannaki | #
|
3 | 4f917833 | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
4 | 4f917833 | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
5 | 4f917833 | Sofia Papagiannaki | # conditions are met:
|
6 | 4f917833 | Sofia Papagiannaki | #
|
7 | 4f917833 | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
8 | 4f917833 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
9 | 4f917833 | Sofia Papagiannaki | # disclaimer.
|
10 | 4f917833 | Sofia Papagiannaki | #
|
11 | 4f917833 | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
12 | 4f917833 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
13 | 4f917833 | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
14 | 4f917833 | Sofia Papagiannaki | # provided with the distribution.
|
15 | 4f917833 | Sofia Papagiannaki | #
|
16 | 4f917833 | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 4f917833 | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 4f917833 | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 4f917833 | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 4f917833 | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 4f917833 | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 4f917833 | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 4f917833 | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 4f917833 | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 4f917833 | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 4f917833 | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 4f917833 | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 4f917833 | Sofia Papagiannaki | #
|
29 | 4f917833 | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
30 | 4f917833 | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
31 | 4f917833 | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
32 | 4f917833 | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
33 | 4f917833 | Sofia Papagiannaki | |
34 | 4f917833 | Sofia Papagiannaki | from sqlalchemy.sql import select, literal |
35 | 4f1bc0a6 | Sofia Papagiannaki | from sqlalchemy.sql.expression import join, union |
36 | 4f917833 | Sofia Papagiannaki | |
37 | 4f917833 | Sofia Papagiannaki | from xfeatures import XFeatures |
38 | 4f917833 | Sofia Papagiannaki | from groups import Groups |
39 | 4f917833 | Sofia Papagiannaki | from public import Public |
40 | 4f917833 | Sofia Papagiannaki | |
41 | 4f917833 | Sofia Papagiannaki | |
42 | 4f917833 | Sofia Papagiannaki | READ = 0
|
43 | 4f917833 | Sofia Papagiannaki | WRITE = 1
|
44 | 4f917833 | Sofia Papagiannaki | |
45 | 4f917833 | Sofia Papagiannaki | |
46 | 4f917833 | Sofia Papagiannaki | class Permissions(XFeatures, Groups, Public): |
47 | 4f917833 | Sofia Papagiannaki | |
48 | 4f917833 | Sofia Papagiannaki | def __init__(self, **params): |
49 | 4f917833 | Sofia Papagiannaki | XFeatures.__init__(self, **params)
|
50 | 4f917833 | Sofia Papagiannaki | Groups.__init__(self, **params)
|
51 | 4f917833 | Sofia Papagiannaki | Public.__init__(self, **params)
|
52 | 4f917833 | Sofia Papagiannaki | |
53 | 4f917833 | Sofia Papagiannaki | def access_grant(self, path, access, members=()): |
54 | 4f917833 | Sofia Papagiannaki | """Grant members with access to path.
|
55 | 4f917833 | Sofia Papagiannaki | Members can also be '*' (all),
|
56 | 4f917833 | Sofia Papagiannaki | or some group specified as 'owner:group'."""
|
57 | 4f917833 | Sofia Papagiannaki | |
58 | 4f917833 | Sofia Papagiannaki | if not members: |
59 | 4f917833 | Sofia Papagiannaki | return
|
60 | 4f917833 | Sofia Papagiannaki | feature = self.xfeature_create(path)
|
61 | 4f917833 | Sofia Papagiannaki | if feature is None: |
62 | 4f917833 | Sofia Papagiannaki | return
|
63 | 4f917833 | Sofia Papagiannaki | self.feature_setmany(feature, access, members)
|
64 | 4f917833 | Sofia Papagiannaki | |
65 | 4f917833 | Sofia Papagiannaki | def access_set(self, path, permissions): |
66 | 4f917833 | Sofia Papagiannaki | """Set permissions for path. The permissions dict
|
67 | 4f917833 | Sofia Papagiannaki | maps 'read', 'write' keys to member lists."""
|
68 | 4f917833 | Sofia Papagiannaki | |
69 | 4f917833 | Sofia Papagiannaki | self.xfeature_destroy(path)
|
70 | 4f917833 | Sofia Papagiannaki | self.access_grant(path, READ, permissions.get('read', [])) |
71 | 4f917833 | Sofia Papagiannaki | self.access_grant(path, WRITE, permissions.get('write', [])) |
72 | 4f917833 | Sofia Papagiannaki | |
73 | 4f917833 | Sofia Papagiannaki | def access_clear(self, path): |
74 | 4f917833 | Sofia Papagiannaki | """Revoke access to path (both permissions and public)."""
|
75 | 4f917833 | Sofia Papagiannaki | |
76 | 4f917833 | Sofia Papagiannaki | self.xfeature_destroy(path)
|
77 | 4f917833 | Sofia Papagiannaki | self.public_unset(path)
|
78 | 4f917833 | Sofia Papagiannaki | |
79 | 4f917833 | Sofia Papagiannaki | def access_check(self, path, access, member): |
80 | 4f917833 | Sofia Papagiannaki | """Return true if the member has this access to the path."""
|
81 | 4f917833 | Sofia Papagiannaki | |
82 | 4f917833 | Sofia Papagiannaki | if access == READ and self.public_check(path): |
83 | 4f917833 | Sofia Papagiannaki | return True |
84 | 4f917833 | Sofia Papagiannaki | |
85 | 4f917833 | Sofia Papagiannaki | r = self.xfeature_inherit(path)
|
86 | 4f917833 | Sofia Papagiannaki | if not r: |
87 | 4f917833 | Sofia Papagiannaki | return False |
88 | 4f917833 | Sofia Papagiannaki | fpath, feature = r |
89 | 4f917833 | Sofia Papagiannaki | members = self.feature_get(feature, access)
|
90 | 4f917833 | Sofia Papagiannaki | if member in members or '*' in members: |
91 | 4f917833 | Sofia Papagiannaki | return True |
92 | 4f917833 | Sofia Papagiannaki | for owner, group in self.group_parents(member): |
93 | 4f917833 | Sofia Papagiannaki | if owner + ':' + group in members: |
94 | 4f917833 | Sofia Papagiannaki | return True |
95 | 4f917833 | Sofia Papagiannaki | return False |
96 | 4f917833 | Sofia Papagiannaki | |
97 | 4f917833 | Sofia Papagiannaki | def access_inherit(self, path): |
98 | 4f917833 | Sofia Papagiannaki | """Return the inherited or assigned (path, permissions) pair for path."""
|
99 | 4f917833 | Sofia Papagiannaki | |
100 | 4f917833 | Sofia Papagiannaki | r = self.xfeature_inherit(path)
|
101 | 4f917833 | Sofia Papagiannaki | if not r: |
102 | 4f917833 | Sofia Papagiannaki | return (path, {})
|
103 | 4f917833 | Sofia Papagiannaki | fpath, feature = r |
104 | 4f917833 | Sofia Papagiannaki | permissions = self.feature_dict(feature)
|
105 | 4f917833 | Sofia Papagiannaki | if READ in permissions: |
106 | 4f917833 | Sofia Papagiannaki | permissions['read'] = permissions[READ]
|
107 | 4f917833 | Sofia Papagiannaki | del(permissions[READ])
|
108 | 4f917833 | Sofia Papagiannaki | if WRITE in permissions: |
109 | 4f917833 | Sofia Papagiannaki | permissions['write'] = permissions[WRITE]
|
110 | 4f917833 | Sofia Papagiannaki | del(permissions[WRITE])
|
111 | 4f917833 | Sofia Papagiannaki | return (fpath, permissions)
|
112 | 4f917833 | Sofia Papagiannaki | |
113 | 4f917833 | Sofia Papagiannaki | def access_list(self, path): |
114 | 4f917833 | Sofia Papagiannaki | """List all permission paths inherited by or inheriting from path."""
|
115 | 4f917833 | Sofia Papagiannaki | |
116 | 4f917833 | Sofia Papagiannaki | return [x[0] for x in self.xfeature_list(path) if x[0] != path] |
117 | 4f917833 | Sofia Papagiannaki | |
118 | 4f917833 | Sofia Papagiannaki | def access_list_paths(self, member, prefix=None): |
119 | 4f917833 | Sofia Papagiannaki | """Return the list of paths granted to member."""
|
120 | 4f917833 | Sofia Papagiannaki | |
121 | 4f917833 | Sofia Papagiannaki | xfeatures_xfeaturevals = self.xfeatures.join(self.xfeaturevals) |
122 | 4f917833 | Sofia Papagiannaki | |
123 | 4f917833 | Sofia Papagiannaki | selectable = (self.groups.c.owner + ':' + self.groups.c.name) |
124 | 4f917833 | Sofia Papagiannaki | member_groups = select([selectable.label('value')],
|
125 | 4f917833 | Sofia Papagiannaki | self.groups.c.member == member)
|
126 | 4f917833 | Sofia Papagiannaki | |
127 | 4f917833 | Sofia Papagiannaki | members = select([literal(member).label('value')])
|
128 | f992aa60 | Sofia Papagiannaki | any = select([literal('*').label('value')]) |
129 | 4f917833 | Sofia Papagiannaki | |
130 | fe232f24 | Sofia Papagiannaki | u = union(member_groups, members, any).alias()
|
131 | 4f1bc0a6 | Sofia Papagiannaki | inner_join = join(xfeatures_xfeaturevals, u, |
132 | fe232f24 | Sofia Papagiannaki | self.xfeaturevals.c.value == u.c.value)
|
133 | 4f917833 | Sofia Papagiannaki | s = select([self.xfeatures.c.path], from_obj=[inner_join]).distinct()
|
134 | 4f917833 | Sofia Papagiannaki | if prefix:
|
135 | 4f917833 | Sofia Papagiannaki | s = s.where(self.xfeatures.c.path.like(prefix + '%')) |
136 | 4f917833 | Sofia Papagiannaki | r = self.conn.execute(s)
|
137 | 4f917833 | Sofia Papagiannaki | l = [row[0] for row in r.fetchall()] |
138 | 4f917833 | Sofia Papagiannaki | r.close() |
139 | 4f917833 | Sofia Papagiannaki | return l
|
140 | 4f917833 | Sofia Papagiannaki | |
141 | 4f917833 | Sofia Papagiannaki | def access_list_shared(self, prefix=''): |
142 | 4f917833 | Sofia Papagiannaki | """Return the list of shared paths."""
|
143 | 4f917833 | Sofia Papagiannaki | |
144 | 4f917833 | Sofia Papagiannaki | s = select([self.xfeatures.c.path],
|
145 | 4f917833 | Sofia Papagiannaki | self.xfeatures.c.path.like(prefix + '%')) |
146 | 4f917833 | Sofia Papagiannaki | r = self.conn.execute(s)
|
147 | 4f917833 | Sofia Papagiannaki | l = [row[0] for row in r.fetchall()] |
148 | 4f917833 | Sofia Papagiannaki | r.close() |
149 | 937dc831 | Antony Chazapis | return l |