|
Lines 4-10
Link Here
|
| 4 |
# Univention Management Console module: |
4 |
# Univention Management Console module: |
| 5 |
# Administration of groups |
5 |
# Administration of groups |
| 6 |
# |
6 |
# |
| 7 |
# Copyright 2012-2016 Univention GmbH |
7 |
# Copyright 2012-2017 Univention GmbH |
| 8 |
# |
8 |
# |
| 9 |
# http://www.univention.de/ |
9 |
# http://www.univention.de/ |
| 10 |
# |
10 |
# |
|
Lines 119-133
def get(self, request, ldap_user_read=None, ldap_position=None):
Link Here
|
| 119 |
result['classes'] = [{'id': class_.dn, 'label': class_.get_relative_name()} for class_ in classes] |
119 |
result['classes'] = [{'id': class_.dn, 'label': class_.get_relative_name()} for class_ in classes] |
| 120 |
self.finished(request.id, [result]) |
120 |
self.finished(request.id, [result]) |
| 121 |
return |
121 |
return |
|
|
122 |
result['members'] = self._filter_members(request, group, result.pop('users', []), ldap_user_read) |
| 122 |
|
123 |
|
|
|
124 |
self.finished(request.id, [result, ]) |
| 125 |
|
| 126 |
@staticmethod |
| 127 |
def _filter_members(request, group, users, ldap_user_read=None): |
| 123 |
members = [] |
128 |
members = [] |
| 124 |
for member_dn in result.pop('users', []): |
129 |
for member_dn in users: |
| 125 |
try: |
130 |
try: |
| 126 |
user = User.from_dn(member_dn, None, ldap_user_read) |
131 |
user = User.from_dn(member_dn, None, ldap_user_read) |
| 127 |
except udm_exceptions.noObject: |
132 |
except udm_exceptions.noObject: |
| 128 |
MODULE.process('Could not open (foreign) user %r: no permissions/does not exists/not a user' % (member_dn,)) |
133 |
MODULE.process('Could not open (foreign) user %r: no permissions/does not exists/not a user' % (member_dn,)) |
| 129 |
continue |
134 |
continue |
| 130 |
if not user.schools or not set(user.schools) & set([group.school]): |
135 |
if not user.schools or not set(user.schools) & {group.school}: |
| 131 |
continue |
136 |
continue |
| 132 |
if request.flavor == 'class' and not user.is_teacher(ldap_user_read): |
137 |
if request.flavor == 'class' and not user.is_teacher(ldap_user_read): |
| 133 |
continue # only display teachers |
138 |
continue # only display teachers |
|
Lines 136-144
def get(self, request, ldap_user_read=None, ldap_position=None):
Link Here
|
| 136 |
elif request.flavor == 'workgroup-admin' and not user.is_student(ldap_user_read) and not user.is_administrator(ldap_user_read) and not user.is_staff(ldap_user_read) and not user.is_teacher(ldap_user_read): |
141 |
elif request.flavor == 'workgroup-admin' and not user.is_student(ldap_user_read) and not user.is_administrator(ldap_user_read) and not user.is_staff(ldap_user_read) and not user.is_teacher(ldap_user_read): |
| 137 |
continue # only display school users |
142 |
continue # only display school users |
| 138 |
members.append({'id': user.dn, 'label': Display.user(user.get_udm_object(ldap_user_read))}) |
143 |
members.append({'id': user.dn, 'label': Display.user(user.get_udm_object(ldap_user_read))}) |
| 139 |
result['members'] = members |
144 |
return members |
| 140 |
|
|
|
| 141 |
self.finished(request.id, [result, ]) |
| 142 |
|
145 |
|
| 143 |
@sanitize(DictSanitizer(dict(object=DictSanitizer({}, required=True)))) |
146 |
@sanitize(DictSanitizer(dict(object=DictSanitizer({}, required=True)))) |
| 144 |
@LDAP_Connection(USER_READ, MACHINE_WRITE) |
147 |
@LDAP_Connection(USER_READ, MACHINE_WRITE) |
|
Lines 155-177
def put(self, request, ldap_machine_write=None, ldap_user_read=None, ldap_positi
Link Here
|
| 155 |
return self.add_teacher_to_classes(request) |
158 |
return self.add_teacher_to_classes(request) |
| 156 |
|
159 |
|
| 157 |
klass = get_group_class(request) |
160 |
klass = get_group_class(request) |
| 158 |
for group in request.options: |
161 |
for group_from_umc in request.options: |
| 159 |
group = group['object'] |
162 |
group_from_umc = group_from_umc['object'] |
| 160 |
group_dn = group['$dn$'] |
163 |
group_from_umc_dn = group_from_umc['$dn$'] |
| 161 |
break |
164 |
break |
| 162 |
|
165 |
|
| 163 |
try: |
166 |
try: |
| 164 |
grp = klass.from_dn(group_dn, None, ldap_machine_write) |
167 |
group_from_ldap = klass.from_dn(group_from_umc_dn, None, ldap_machine_write) |
| 165 |
except udm_exceptions.noObject: |
168 |
except udm_exceptions.noObject: |
| 166 |
raise UMC_Error('unknown group object') |
169 |
raise UMC_Error('unknown group object') |
| 167 |
|
170 |
|
| 168 |
MODULE.info('Modifying group "%s" with members: %s' % (grp.dn, grp.users)) |
171 |
old_members = self._filter_members(request, group_from_ldap, group_from_ldap.users, ldap_user_read) |
| 169 |
MODULE.info('New members: %s' % group['members']) |
172 |
removed_members = set(o['id'] for o in old_members) - set(group_from_umc['members']) |
|
|
173 |
|
| 174 |
MODULE.info('Modifying group "%s" with members: %s' % (group_from_ldap.dn, group_from_ldap.users)) |
| 175 |
MODULE.info('New members: %s' % group_from_umc['members']) |
| 176 |
MODULE.info('Removed members: %s' % (removed_members,)) |
| 170 |
|
177 |
|
| 171 |
if request.flavor == 'workgroup-admin': |
178 |
if request.flavor == 'workgroup-admin': |
| 172 |
# do not allow groups to be renamed in order to avoid conflicts with shares |
179 |
# do not allow groups to be renamed in order to avoid conflicts with shares |
| 173 |
# grp.name = '%(school)s-%(name)s' % group |
180 |
# grp.name = '%(school)s-%(name)s' % group |
| 174 |
grp.description = group['description'] |
181 |
group_from_ldap.description = group_from_umc['description'] |
| 175 |
|
182 |
|
| 176 |
# Workgroup admin view → update teachers, admins, students, (staff) |
183 |
# Workgroup admin view → update teachers, admins, students, (staff) |
| 177 |
# Class view → update only the group's teachers (keep all non teachers) |
184 |
# Class view → update only the group's teachers (keep all non teachers) |
|
Lines 179-219
def put(self, request, ldap_machine_write=None, ldap_user_read=None, ldap_positi
Link Here
|
| 179 |
|
186 |
|
| 180 |
users = [] |
187 |
users = [] |
| 181 |
# keep specific users from the group |
188 |
# keep specific users from the group |
| 182 |
for userdn in grp.users: |
189 |
for userdn in group_from_ldap.users: |
| 183 |
try: |
190 |
try: |
| 184 |
user = User.from_dn(userdn, None, ldap_machine_write) |
191 |
user = User.from_dn(userdn, None, ldap_machine_write) |
| 185 |
except udm_exceptions.noObject: # no permissions/is not a user/does not exists → keep the old value |
192 |
except udm_exceptions.noObject: # no permissions/is not a user/does not exists → keep the old value |
| 186 |
users.append(userdn) |
193 |
users.append(userdn) |
| 187 |
continue |
194 |
continue |
| 188 |
if not user.schools or not set(user.schools) & set([grp.school]): |
195 |
if not user.schools or not set(user.schools) & set([group_from_ldap.school]): |
| 189 |
users.append(userdn) |
196 |
users.append(userdn) |
| 190 |
continue |
197 |
continue |
| 191 |
if (request.flavor == 'class' and not user.is_teacher(ldap_machine_write)) or (request.flavor == 'workgroup' and not user.is_student(ldap_machine_write)) or request.flavor == 'workgroup-admin': |
198 |
if (request.flavor == 'class' and not user.is_teacher(ldap_machine_write)) or (request.flavor == 'workgroup' and not user.is_student(ldap_machine_write)) or request.flavor == 'workgroup-admin': |
| 192 |
users.append(userdn) |
199 |
users.append(userdn) |
| 193 |
|
200 |
|
| 194 |
# add only certain users to the group |
201 |
# add only certain users to the group |
| 195 |
for userdn in group['members']: |
202 |
for userdn in group_from_umc['members']: |
| 196 |
try: |
203 |
try: |
| 197 |
user = User.from_dn(userdn, None, ldap_machine_write) |
204 |
user = User.from_dn(userdn, None, ldap_machine_write) |
| 198 |
except udm_exceptions.noObject as exc: |
205 |
except udm_exceptions.noObject as exc: |
| 199 |
MODULE.error('Not adding not existing user %r to group: %r.' % (userdn, exc)) |
206 |
MODULE.error('Not adding not existing user %r to group: %r.' % (userdn, exc)) |
| 200 |
continue |
207 |
continue |
| 201 |
if not user.schools or not set(user.schools) & set([grp.school]): |
208 |
if not user.schools or not set(user.schools) & set([group_from_ldap.school]): |
| 202 |
raise UMC_Error(_('User %s does not belong to school %r.') % (Display.user(user.get_udm_object(ldap_machine_write)), grp.school)) |
209 |
raise UMC_Error(_('User %s does not belong to school %r.') % (Display.user(user.get_udm_object(ldap_machine_write)), group_from_ldap.school)) |
| 203 |
if request.flavor == 'workgroup-admin' and not user.is_student(ldap_machine_write) and not user.is_administrator(ldap_machine_write) and not user.is_staff(ldap_machine_write) and not user.is_teacher(ldap_machine_write): |
210 |
if request.flavor == 'workgroup-admin' and not user.is_student(ldap_machine_write) and not user.is_administrator(ldap_machine_write) and not user.is_staff(ldap_machine_write) and not user.is_teacher(ldap_machine_write): |
| 204 |
raise UMC_Error(_('User %s does not belong to school %r.') % (Display.user(user.get_udm_object(ldap_machine_write)), grp.school)) |
211 |
raise UMC_Error(_('User %s does not belong to school %r.') % (Display.user(user.get_udm_object(ldap_machine_write)), group_from_ldap.school)) |
| 205 |
if request.flavor == 'class' and not user.is_teacher(ldap_machine_write): |
212 |
if request.flavor == 'class' and not user.is_teacher(ldap_machine_write): |
| 206 |
raise UMC_Error(_('User %s is not a teacher.') % (Display.user(user.get_udm_object(ldap_machine_write)),)) |
213 |
raise UMC_Error(_('User %s is not a teacher.') % (Display.user(user.get_udm_object(ldap_machine_write)),)) |
| 207 |
if request.flavor == 'workgroup' and not user.is_student(ldap_machine_write): |
214 |
if request.flavor == 'workgroup' and not user.is_student(ldap_machine_write): |
| 208 |
raise UMC_Error(_('User %s is not a student.') % (Display.user(user.get_udm_object(ldap_machine_write)),)) |
215 |
raise UMC_Error(_('User %s is not a student.') % (Display.user(user.get_udm_object(ldap_machine_write)),)) |
| 209 |
users.append(user.dn) |
216 |
users.append(user.dn) |
| 210 |
|
217 |
|
| 211 |
grp.users = list(set(users)) |
218 |
group_from_ldap.users = list(set(users) - removed_members) |
| 212 |
try: |
219 |
try: |
| 213 |
success = grp.modify(ldap_machine_write) |
220 |
success = group_from_ldap.modify(ldap_machine_write) |
| 214 |
MODULE.info('Modified, group has now members: %s' % (grp.users,)) |
221 |
MODULE.info('Modified, group has now members: %s' % (group_from_ldap.users,)) |
| 215 |
except udm_exceptions.base as exc: |
222 |
except udm_exceptions.base as exc: |
| 216 |
MODULE.process('An error occurred while modifying "%s": %s' % (group['$dn$'], exc.message)) |
223 |
MODULE.process('An error occurred while modifying "%s": %s' % (group_from_umc['$dn$'], exc.message)) |
| 217 |
raise UMC_Error(_('Failed to modify group (%s).') % exc.message) |
224 |
raise UMC_Error(_('Failed to modify group (%s).') % exc.message) |
| 218 |
|
225 |
|
| 219 |
self.finished(request.id, success) |
226 |
self.finished(request.id, success) |