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