001/*
002 * (C) Copyright 2006-2019 Nuxeo (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 *     Nuxeo - initial API and implementation
018 */
019package org.nuxeo.ecm.core.api.impl;
020
021import static java.util.Objects.requireNonNullElseGet;
022
023import java.io.Serializable;
024import java.util.Collections;
025import java.util.List;
026
027import org.apache.commons.lang3.builder.EqualsBuilder;
028import org.apache.commons.lang3.builder.HashCodeBuilder;
029import org.apache.commons.lang3.builder.ToStringBuilder;
030import org.nuxeo.ecm.core.api.DocumentModel;
031import org.nuxeo.ecm.core.api.NuxeoPrincipal;
032
033/**
034 * NuxeoPrincipal stub implementation.
035 *
036 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
037 */
038public class UserPrincipal implements NuxeoPrincipal, Serializable {
039
040    private static final long serialVersionUID = 2013321088068583749L;
041
042    protected boolean anonymous;
043
044    protected boolean administrator;
045
046    protected String userName;
047
048    protected List<String> groups;
049
050    protected List<String> roles;
051
052    protected String firstName;
053
054    protected String lastName;
055
056    protected String email;
057
058    protected String company;
059
060    protected transient String password;
061
062    protected DocumentModel model;
063
064    protected String originatingUser;
065
066    public UserPrincipal(String username, List<String> groups, boolean anonymous, boolean administrator) {
067        userName = username;
068        this.groups = requireNonNullElseGet(groups, Collections::emptyList);
069        this.anonymous = anonymous;
070        this.administrator = administrator;
071    }
072
073    @Override
074    public String getEmail() {
075        return email;
076    }
077
078    @Override
079    public void setEmail(String email) {
080        this.email = email;
081    }
082
083    @Override
084    public String getCompany() {
085        return company;
086    }
087
088    @Override
089    public String getFirstName() {
090        return firstName;
091    }
092
093    @Override
094    public String getLastName() {
095        return lastName;
096    }
097
098    @Override
099    public void setCompany(String company) {
100        this.company = company;
101    }
102
103    @Override
104    public void setFirstName(String firstName) {
105        this.firstName = firstName;
106    }
107
108    @Override
109    public void setLastName(String lastName) {
110        this.lastName = lastName;
111    }
112
113    @Override
114    public void setName(String name) {
115        userName = name;
116    }
117
118    @Override
119    public String getName() {
120        return userName;
121    }
122
123    @Override
124    public List<String> getGroups() {
125        return groups;
126    }
127
128    // TODO OG: this is not the true semantics but is it really a problem here?
129    @Override
130    public List<String> getAllGroups() {
131        return groups;
132    }
133
134    @Override
135    public List<String> getRoles() {
136        return roles;
137    }
138
139    @Override
140    public void setGroups(List<String> groups) {
141        this.groups = groups;
142    }
143
144    @Override
145    public void setRoles(List<String> roles) {
146        this.roles = roles;
147    }
148
149    @Override
150    public String getPassword() {
151        return password;
152    }
153
154    @Override
155    public void setPassword(String password) {
156        this.password = password;
157    }
158
159    @Override
160    public String getPrincipalId() {
161        return null;
162    }
163
164    @Override
165    public void setPrincipalId(String principalId) {
166    }
167
168    @Override
169    public DocumentModel getModel() {
170        return model;
171    }
172
173    @Override
174    public void setModel(DocumentModel model) {
175        this.model = model;
176    }
177
178    @Override
179    public boolean isMemberOf(String group) {
180        return groups.contains(group);
181    }
182
183    @Override
184    public boolean isAdministrator() {
185        return administrator;
186    }
187
188    @Override
189    public String getTenantId() {
190        return null;
191    }
192
193    @Override
194    public boolean isAnonymous() {
195        return anonymous;
196    }
197
198    @Override
199    public String getOriginatingUser() {
200        return originatingUser;
201    }
202
203    @Override
204    public void setOriginatingUser(String originatingUser) {
205        this.originatingUser = originatingUser;
206    }
207
208    @Override
209    public String getActingUser() {
210        return getOriginatingUser() == null ? getName() : getOriginatingUser();
211    }
212
213    @Override
214    public boolean isTransient() {
215        String name = getName();
216        return name != null && name.startsWith(TRANSIENT_USER_PREFIX);
217    }
218
219    @Override
220    public int hashCode() {
221        return new HashCodeBuilder().append(userName)
222                                    .append(groups)
223                                    .append(roles)
224                                    .append(firstName)
225                                    .append(lastName)
226                                    .append(company)
227                                    .append(password)
228                                    .toHashCode();
229    }
230
231    @Override
232    public boolean equals(Object o) {
233        if (this == o) {
234            return true;
235        }
236        if (!(o instanceof UserPrincipal)) {
237            return false;
238        }
239
240        UserPrincipal that = (UserPrincipal) o;
241        return new EqualsBuilder().append(userName, that.userName)
242                                  .append(groups, that.groups)
243                                  .append(roles, that.roles)
244                                  .append(firstName, that.firstName)
245                                  .append(lastName, that.lastName)
246                                  .append(company, that.company)
247                                  .append(password, that.password)
248                                  .isEquals();
249    }
250
251    @Override
252    public String toString() {
253        return ToStringBuilder.reflectionToString(this);
254    }
255}