001/*
002 * (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Florent Guillaume
018 */
019package org.nuxeo.ecm.platform.usermanager;
020
021import java.io.Serializable;
022import java.security.Principal;
023import java.util.Collections;
024import java.util.HashMap;
025import java.util.LinkedHashMap;
026import java.util.List;
027import java.util.Map;
028import java.util.Set;
029import java.util.regex.Matcher;
030import java.util.regex.Pattern;
031
032import org.nuxeo.ecm.core.api.DocumentModel;
033import org.nuxeo.ecm.core.api.DocumentModelList;
034import org.nuxeo.ecm.core.api.NuxeoGroup;
035import org.nuxeo.ecm.core.api.NuxeoPrincipal;
036import org.nuxeo.ecm.core.api.security.ACP;
037import org.nuxeo.ecm.core.api.security.SecurityConstants;
038import org.nuxeo.runtime.services.event.Event;
039
040/**
041 * @author Florent Guillaume
042 */
043public class FakeUserManagerImpl implements UserManager {
044
045    private static final long serialVersionUID = 1L;
046
047    String userListingMode;
048
049    String groupListingMode;
050
051    List<String> defaultAdministratorIds;
052
053    List<String> administratorsGroups;
054
055    String defaultGroup;
056
057    String userSortField;
058
059    String groupSortField;
060
061    String userDirectoryName;
062
063    String userEmailField;
064
065    Map<String, MatchType> userSearchFields;
066
067    Pattern userPasswordPattern;
068
069    String groupDirectoryName;
070
071    String groupMembersField;
072
073    Map<String, MatchType> groupSearchFields;
074
075    String groupSubGroupsField;
076
077    String groupParentGroupsField;
078
079    VirtualUser anonymousUser;
080
081    final Map<String, VirtualUserDescriptor> virtualUsers;
082
083    public FakeUserManagerImpl() {
084        virtualUsers = new HashMap<>();
085    }
086
087    @Override
088    public String getUserListingMode() {
089        return userListingMode;
090    }
091
092    public void setUserListingMode(String userListingMode) {
093        this.userListingMode = userListingMode;
094    }
095
096    @Override
097    public String getGroupListingMode() {
098        return groupListingMode;
099    }
100
101    public void setGroupListingMode(String groupListingMode) {
102        this.groupListingMode = groupListingMode;
103    }
104
105    @Override
106    public String getDefaultGroup() {
107        return defaultGroup;
108    }
109
110    public void setDefaultGroup(String defaultGroup) {
111        this.defaultGroup = defaultGroup;
112    }
113
114    @Override
115    public String getUserSortField() {
116        return userSortField;
117    }
118
119    public void setUserSortField(String sortField) {
120        userSortField = sortField;
121    }
122
123    public void setGroupSortField(String sortField) {
124        groupSortField = sortField;
125    }
126
127    public void setUserDirectoryName(String userDirectoryName) {
128        this.userDirectoryName = userDirectoryName;
129    }
130
131    @Override
132    public String getUserDirectoryName() {
133        return userDirectoryName;
134    }
135
136    public void setUserEmailField(String userEmailField) {
137        this.userEmailField = userEmailField;
138    }
139
140    @Override
141    public String getUserEmailField() {
142        return userEmailField;
143    }
144
145    public void setUserSearchFields(Set<String> userSearchFields) {
146        this.userSearchFields = new LinkedHashMap<>();
147        for (String searchField : userSearchFields) {
148            this.userSearchFields.put(searchField, MatchType.SUBSTRING);
149        }
150    }
151
152    public void setUserSearchFields(Map<String, MatchType> userSearchFields) {
153        this.userSearchFields = userSearchFields;
154    }
155
156    @Override
157    public Set<String> getUserSearchFields() {
158        return userSearchFields.keySet();
159    }
160
161    public void setGroupSearchFields(Map<String, MatchType> groupSearchFields) {
162        this.groupSearchFields = groupSearchFields;
163    }
164
165    @Override
166    public Set<String> getGroupSearchFields() {
167        return groupSearchFields.keySet();
168    }
169
170    public void setGroupDirectoryName(String groupDirectoryName) {
171        this.groupDirectoryName = groupDirectoryName;
172    }
173
174    @Override
175    public String getGroupDirectoryName() {
176        return groupDirectoryName;
177    }
178
179    public void setGroupMembersField(String groupMembersField) {
180        this.groupMembersField = groupMembersField;
181    }
182
183    @Override
184    public String getGroupMembersField() {
185        return groupMembersField;
186    }
187
188    public void setGroupSubGroupsField(String groupSubGroupsField) {
189        this.groupSubGroupsField = groupSubGroupsField;
190    }
191
192    @Override
193    public String getGroupSubGroupsField() {
194        return groupSubGroupsField;
195    }
196
197    public void setGroupParentGroupsField(String groupParentGroupsField) {
198        this.groupParentGroupsField = groupParentGroupsField;
199    }
200
201    @Override
202    public String getGroupParentGroupsField() {
203        return groupParentGroupsField;
204    }
205
206    @Override
207    public Boolean areGroupsReadOnly() {
208        throw new UnsupportedOperationException();
209    }
210
211    @Override
212    public Boolean areUsersReadOnly() {
213        throw new UnsupportedOperationException();
214    }
215
216    @Override
217    public boolean checkUsernamePassword(String username, String password) {
218        throw new UnsupportedOperationException();
219    }
220
221    @Override
222    public boolean validatePassword(String password) {
223        if (userPasswordPattern == null) {
224            return true;
225        } else {
226            Matcher userPasswordMatcher = userPasswordPattern.matcher(password);
227            return userPasswordMatcher.find();
228        }
229    }
230
231    @Override
232    public List<String> getGroupsInGroup(String parentId) {
233        throw new UnsupportedOperationException();
234    }
235
236    @Override
237    public NuxeoPrincipal getPrincipal(String username) {
238        NuxeoPrincipalImpl principal = new NuxeoPrincipalImpl(SecurityConstants.ADMINISTRATOR, false, true);
239        principal.setGroups(Collections.singletonList(SecurityConstants.ADMINISTRATORS));
240        principal.setEmail("admin@example.com");
241        return principal;
242    }
243
244    @Override
245    public List<String> getTopLevelGroups() {
246        throw new UnsupportedOperationException();
247    }
248
249    @Override
250    public List<String> getUsersInGroup(String groupId) {
251        throw new UnsupportedOperationException();
252    }
253
254    @Override
255    public List<String> getUsersInGroupAndSubGroups(String groupId) {
256        throw new UnsupportedOperationException();
257    }
258
259    @Override
260    public DocumentModelList searchGroups(String pattern) {
261        throw new UnsupportedOperationException();
262    }
263
264    @Override
265    public List<NuxeoPrincipal> searchPrincipals(String pattern) {
266        throw new UnsupportedOperationException();
267    }
268
269    @Override
270    public Pattern getUserPasswordPattern() {
271        return userPasswordPattern;
272    }
273
274    public void setUserPasswordPattern(Pattern userPasswordPattern) {
275        this.userPasswordPattern = userPasswordPattern;
276    }
277
278    public void setAnonymousUser(VirtualUser anonymousUser) {
279        this.anonymousUser = anonymousUser;
280    }
281
282    public void setVirtualUsers(Map<String, VirtualUserDescriptor> virtualUsers) {
283        this.virtualUsers.clear();
284        if (virtualUsers != null) {
285            this.virtualUsers.putAll(virtualUsers);
286        }
287    }
288
289    @Override
290    public String getAnonymousUserId() {
291        if (anonymousUser == null) {
292            return null;
293        }
294        return anonymousUser.getId();
295    }
296
297    @Override
298    public String getDigestAuthDirectory() {
299        return null;
300    }
301
302    @Override
303    public String getDigestAuthRealm() {
304        return null;
305    }
306
307    @Override
308    public void setConfiguration(UserManagerDescriptor descriptor) {
309        setDefaultGroup(descriptor.defaultGroup);
310        defaultAdministratorIds = descriptor.defaultAdministratorIds;
311        administratorsGroups = descriptor.administratorsGroups;
312        setUserSortField(descriptor.userSortField);
313        setGroupSortField(descriptor.groupSortField);
314        setUserListingMode(descriptor.userListingMode);
315        setGroupListingMode(descriptor.groupListingMode);
316        setUserDirectoryName(descriptor.userDirectoryName);
317        setUserEmailField(descriptor.userEmailField);
318        setUserSearchFields(descriptor.userSearchFields);
319        setUserPasswordPattern(descriptor.userPasswordPattern);
320        setGroupDirectoryName(descriptor.groupDirectoryName);
321        setGroupMembersField(descriptor.groupMembersField);
322        setGroupSubGroupsField(descriptor.groupSubGroupsField);
323        setGroupParentGroupsField(descriptor.groupParentGroupsField);
324        setGroupSearchFields(descriptor.groupSearchFields);
325        setAnonymousUser(descriptor.anonymousUser);
326        setVirtualUsers(descriptor.virtualUsers);
327    }
328
329    @Override
330    public DocumentModel getBareUserModel() {
331        throw new UnsupportedOperationException();
332    }
333
334    @Override
335    public DocumentModel createGroup(DocumentModel groupModel) {
336        throw new UnsupportedOperationException();
337    }
338
339    @Override
340    public DocumentModel createUser(DocumentModel userModel) {
341        throw new UnsupportedOperationException();
342    }
343
344    @Override
345    public void deleteGroup(DocumentModel groupModel) {
346        throw new UnsupportedOperationException();
347    }
348
349    @Override
350    public void deleteGroup(String groupId) {
351        throw new UnsupportedOperationException();
352    }
353
354    @Override
355    public void deleteUser(DocumentModel userModel) {
356        throw new UnsupportedOperationException();
357    }
358
359    @Override
360    public void deleteUser(String userId) {
361        throw new UnsupportedOperationException();
362    }
363
364    @Override
365    public DocumentModel getBareGroupModel() {
366        throw new UnsupportedOperationException();
367    }
368
369    @Override
370    public NuxeoGroup getGroup(String groupName) {
371        throw new UnsupportedOperationException();
372    }
373
374    @Override
375    public List<String> getGroupIds() {
376        throw new UnsupportedOperationException();
377    }
378
379    @Override
380    public List<String> getUserIds() {
381        throw new UnsupportedOperationException();
382    }
383
384    @Override
385    public DocumentModelList searchGroups(Map<String, Serializable> filter, Set<String> fulltext) {
386        throw new UnsupportedOperationException();
387    }
388
389    @Override
390    public DocumentModelList searchUsers(Map<String, Serializable> filter, Set<String> fulltext) {
391        throw new UnsupportedOperationException();
392    }
393
394    @Override
395    public DocumentModelList searchUsers(String pattern) {
396        throw new UnsupportedOperationException();
397    }
398
399    @Override
400    public void updateGroup(DocumentModel groupModel) {
401        throw new UnsupportedOperationException();
402    }
403
404    @Override
405    public void updateUser(DocumentModel userModel) {
406        throw new UnsupportedOperationException();
407    }
408
409    @Override
410    public DocumentModel getGroupModel(String groupName) {
411        throw new UnsupportedOperationException();
412    }
413
414    @Override
415    public DocumentModel getUserModel(String userName) {
416        throw new UnsupportedOperationException();
417    }
418
419    @Override
420    public String getGroupIdField() {
421        return "groupname";
422    }
423
424    @Override
425    public String getGroupLabelField() {
426        return "grouplabel";
427    }
428
429    @Override
430    public String getGroupSchemaName() {
431        return "group";
432    }
433
434    @Override
435    public String getUserIdField() {
436        return "username";
437    }
438
439    @Override
440    public String getUserSchemaName() {
441        return "user";
442    }
443
444    @Override
445    public List<String> getAdministratorsGroups() {
446        throw new UnsupportedOperationException();
447    }
448
449    @Override
450    public String[] getUsersForPermission(String perm, ACP acp) {
451        throw new UnsupportedOperationException();
452    }
453
454    @Override
455    public Principal authenticate(String name, String password) {
456        return checkUsernamePassword(name, password) ? getPrincipal(name) : null;
457    }
458
459    @Override
460    public void handleEvent(Event event) {
461    }
462
463    @Override
464    public List<String> getAncestorGroups(String groupId) {
465        throw new UnsupportedOperationException();
466    }
467
468    @Override
469    public GroupConfig getGroupConfig() {
470        throw new UnsupportedOperationException();
471    }
472
473    @Override
474    public void notifyUserChanged(String userName, String eventId) {
475        throw new UnsupportedOperationException();
476    }
477
478    @Override
479    public void notifyGroupChanged(String groupName, String eventId, List<String> ancestorGroupNames) {
480        throw new UnsupportedOperationException();
481    }
482
483}