/** * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.glite.security.voms.admin.persistence.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.TimeUnit; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.glite.security.voms.User; import org.glite.security.voms.admin.apiv2.VOMSUserJSON; import org.glite.security.voms.admin.error.IllegalStateException; import org.glite.security.voms.admin.error.NotFoundException; import org.glite.security.voms.admin.error.NullArgumentException; import org.glite.security.voms.admin.error.VOMSSyntaxException; import org.glite.security.voms.admin.persistence.error.AlreadyExistsException; import org.glite.security.voms.admin.persistence.error.NoSuchAttributeException; import org.glite.security.voms.admin.persistence.error.NoSuchMappingException; import org.glite.security.voms.admin.persistence.error.VOMSInconsistentDatabaseException; import org.glite.security.voms.admin.persistence.model.attribute.VOMSUserAttribute; import org.glite.security.voms.admin.persistence.model.personal_info.PersonalInformationRecord; import org.glite.security.voms.admin.persistence.model.request.RequesterInfo; import org.glite.security.voms.admin.persistence.model.task.SignAUPTask; import org.glite.security.voms.admin.persistence.model.task.Task; import org.glite.security.voms.admin.persistence.model.task.Task.TaskStatus; import org.glite.security.voms.admin.util.PathNamingScheme; import org.hibernate.annotations.SortNatural; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * * * @author andrea * */ @Entity @Table(name = "usr") public class VOMSUser implements Serializable, Comparable<VOMSUser> { private static final long serialVersionUID = -3815869585264835046L; public static final Logger log = LoggerFactory.getLogger(VOMSUser.class); public enum SuspensionReason { FAILED_TO_SIGN_AUP("User failed to sign the AUP in time."), MEMBERSHIP_EXPIRATION("User membership has expired."), SECURITY_INCIDENT( "User membership has been suspended after a security incident."), OTHER("User membership has been suspended for another unknown reason."); String message; private SuspensionReason(String msg) { this.message = msg; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } public VOMSUser() { } @Id @Column(name = "userid") @GeneratedValue(strategy=GenerationType.IDENTITY) Long id; // Base membership information (JSPG requirements) String name; String surname; String institution; String address; @Column(name = "phone_number") String phoneNumber; @Column(nullable = false, name = "email_address") String emailAddress; // Compatibility fields String dn; /** This field is here for compatibility reasons **/ @ManyToOne(targetEntity = VOMSCA.class, optional = true) @JoinColumn(name = "ca") VOMSCA ca; // Creation time and validity info @Column(name = "creation_time", nullable = false) Date creationTime; @Column(name = "end_time") Date endTime; @Column(name = "suspended") Boolean suspended = false; @Enumerated(EnumType.STRING) @Column(name = "suspension_reason_code") SuspensionReason suspensionReasonCode; @Column(name = "suspension_reason") String suspensionReason; /** Generic attributes mapping **/ @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user", orphanRemoval=true) Set<VOMSUserAttribute> attributes = new HashSet<VOMSUserAttribute>(); /** Membership mappings **/ @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user", orphanRemoval=true) @SortNatural Set<VOMSMapping> mappings = new TreeSet<VOMSMapping>(); /** User certificates **/ @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user", fetch=FetchType.EAGER) @org.hibernate.annotations.Cascade( value = { org.hibernate.annotations.CascadeType.DELETE_ORPHAN }) Set<Certificate> certificates = new HashSet<Certificate>(); /** AUP acceptance records **/ @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user") @org.hibernate.annotations.Cascade( value = { org.hibernate.annotations.CascadeType.DELETE_ORPHAN }) Set<AUPAcceptanceRecord> aupAcceptanceRecords = new HashSet<AUPAcceptanceRecord>(); /** Assigned tasks **/ @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "user", fetch = FetchType.EAGER) @org.hibernate.annotations.Cascade( value = { org.hibernate.annotations.CascadeType.DELETE_ORPHAN }) Set<Task> tasks = new HashSet<Task>(); /** Personal information set **/ // FIXME: currently ignored by configuration @Transient Set<PersonalInformationRecord> personalInformations = new HashSet<PersonalInformationRecord>(); @Column(name = "orgdb_id", nullable = true) Long orgDbId; /** * @return Returns the emailAddress. */ public String getEmailAddress() { return emailAddress; } /** * @param emailAddress The emailAddress to set. */ public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Set<VOMSUserAttribute> getAttributes() { return attributes; } public void setAttributes(Set<VOMSUserAttribute> attributes) { this.attributes = attributes; } public Set<VOMSMapping> getMappings() { return mappings; } public void setMappings(Set<VOMSMapping> mappings) { this.mappings = mappings; } public VOMSUserAttribute getAttributeByName(String name) { Iterator i = attributes.iterator(); while (i.hasNext()) { VOMSUserAttribute tmp = (VOMSUserAttribute) i.next(); if (tmp.getName() .equals(name)) return tmp; } return null; } public void deleteAttributeByName(String attrName) { deleteAttribute(getAttributeByName(attrName)); } public void deleteAttribute(VOMSUserAttribute val) { if (!attributes.contains(val)) throw new NoSuchAttributeException( "Attribute \"" + val.getName() + "\" undefined for user " + this); attributes.remove(val); } public void setAttribute(String name, String value) { VOMSUserAttribute val = getAttributeByName(name); if (val == null) throw new NoSuchAttributeException( "Attribute \"" + name + "\" undefined for user \"" + this + "\"."); val.setValue(value); } public void cleanMappings(){ Iterator<VOMSMapping> mappingsIter = getMappings().iterator(); while (mappingsIter.hasNext()){ VOMSMapping m = mappingsIter.next(); mappingsIter.remove(); m.getGroup().removeMapping(m); if (m.getRole()!= null){ m.getRole().removeMapping(m); } } } public void addAttribute(VOMSUserAttribute val) { val.setUser(this); if (attributes.contains(val)) { attributes.remove(val); } attributes.add(val); } public boolean isMember(String groupName) { if (groupName == null) throw new NullArgumentException( "Cannot org.glite.security.voms.admin.test membership in a null group!"); if (!PathNamingScheme.isGroup(groupName)) throw new VOMSSyntaxException( "Group name passed as argument does not respect the VOMS FQAN syntax. [" + groupName + "]"); Iterator i = getMappings().iterator(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); if (m.getGroup() .getName() .equals(groupName) && m.isGroupMapping()) return true; } return false; } public boolean isMember(VOMSGroup g) { if (g == null) throw new NullArgumentException( "Cannot org.glite.security.voms.admin.test membership in a null group!"); Iterator i = getMappings().iterator(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); if (m.getGroup() .equals(g) && m.isGroupMapping()) return true; } return false; } public void addToGroup(VOMSGroup g) { log.debug("Adding user \"" + this + "\" to group \"" + g + "\"."); VOMSMapping m = new VOMSMapping(this, g, null); if (!getMappings().add(m)) throw new AlreadyExistsException( "User \"" + this + "\" is already a member of group \"" + g + "\"."); // Add this user to parent groups if (!g.isRootGroup()) { if (!isMember(g.parent)) addToGroup(g.parent); } } public void removeFromGroup(VOMSGroup g) { log.debug("Removing user \"" + this + "\" from group \"" + g + "\"."); dismissRolesInGroup(g); VOMSMapping m = new VOMSMapping(this, g, null); if (getMappings().contains(m)) { getMappings().remove(m); g.removeMapping(m); } else throw new NoSuchMappingException( "User \"" + this + "\" is not a member of group \"" + g + "\"."); } public VOMSMapping assignRole(VOMSGroup g, VOMSRole r) { if (!isMember(g)) throw new NoSuchMappingException( "User \"" + this + "\" is not a member of group \"" + g + "\"."); VOMSMapping m = new VOMSMapping(this, g, r); if (getMappings().contains(m)) throw new AlreadyExistsException("User \"" + this + "\" already has role \"" + r + "\" in group \"" + g + "\"."); log.debug("Assigning role \"" + r + "\" to user \"" + this + "\" in group \"" + g + "\"."); getMappings().add(m); r.getMappings() .add(m); return m; } public VOMSMapping dismissRole(VOMSGroup g, VOMSRole r) { if (!isMember(g)) throw new NoSuchMappingException( "User \"" + this + "\" is not a member of group \"" + g + "\"."); if (!hasRole(g, r)) throw new NoSuchMappingException("User \"" + this + "\" does not have role \"" + r + "\" in group \"" + g + "\"."); log.debug("Dismissing role \"" + r + "\" from user \"" + this + "\" in group \"" + g + "\"."); Iterator i = getMappings().iterator(); boolean removed = false; VOMSMapping m = null; while (i.hasNext()) { m = (VOMSMapping) i.next(); if (m.isRoleMapping()) { if (m.getGroup() .equals(g) && m.getRole() .equals(r)) { i.remove(); boolean removedFromRole = r.removeMapping(m); boolean removedFromGroup = g.removeMapping(m); removed = true; } } } if (!removed) throw new VOMSInconsistentDatabaseException( "Error removing existing role mapping!"); return m; } public void dismissRolesInGroup(VOMSGroup g) { if (!isMember(g)) throw new NoSuchMappingException( "User \"" + this + "\" is not a member of group \"" + g + "\"."); Iterator i = getMappings().iterator(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); if (m.getGroup() .equals(g) && m.isRoleMapping()) { i.remove(); m.getRole().removeMapping(m); m.getGroup().removeMapping(m); } } return; } public boolean hasRole(VOMSGroup g, VOMSRole r) { if (!isMember(g)) throw new NoSuchMappingException( "User \"" + this + "\" is not a member of group \"" + g + "\"."); Iterator i = getMappings().iterator(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); if (m.isRoleMapping()) { if (m.getGroup() .equals(g) && m.getRole() .equals(r)) return true; } } return false; } public boolean hasRole(String fqan) { if (!PathNamingScheme.isQualifiedRole(fqan)) throw new IllegalArgumentException( "Role name passed as argument is not a qualified role! [" + fqan + "]"); String groupName = PathNamingScheme.getGroupName(fqan); String roleName = PathNamingScheme.getRoleName(fqan); Iterator i = getMappings().iterator(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); if (m.isRoleMapping()) { if (m.getGroup() .getName() .equals(groupName) && m.getRole() .getName() .equals(roleName)) return true; } } return false; } public Set getGroups() { SortedSet res = new TreeSet(); Iterator mIter = getMappings().iterator(); while (mIter.hasNext()) { VOMSMapping m = (VOMSMapping) mIter.next(); if (m.isGroupMapping()) res.add(m.getGroup()); } return Collections.unmodifiableSortedSet(res); } public Set getRoles(VOMSGroup g) { SortedSet res = new TreeSet(); Iterator mIter = getMappings().iterator(); while (mIter.hasNext()) { VOMSMapping m = (VOMSMapping) mIter.next(); if (m.isRoleMapping() && m.getGroup() .equals(g)) res.add(m.getRole()); } return Collections.unmodifiableSortedSet(res); } public Set getRoleMappings() { SortedSet res = new TreeSet(); Iterator mIter = getMappings().iterator(); while (mIter.hasNext()) { VOMSMapping m = (VOMSMapping) mIter.next(); if (m.isRoleMapping()) res.add(m.getFQAN()); } return res; } public Map getMappingsMap() { log.debug("mappings.size(): " + getMappings().size()); if (getMappings().size() == 0) return null; Iterator i = getMappings().iterator(); Map map = new TreeMap(); while (i.hasNext()) { VOMSMapping m = (VOMSMapping) i.next(); log.debug("mapping: " + m); if (m.isGroupMapping()) { log.debug("Added group mapping to map: " + m.getGroup()); map.put(m.getGroup(), new TreeSet()); } else if (m.isRoleMapping()) { if (!map.containsKey(m.getGroup())) { Set s = new TreeSet(); s.add(m.getRole()); map.put(m.getGroup(), s); log.debug("Added mapping to map: " + m); } else { Set s = (Set) map.get(m.getGroup()); s.add(m.getRole()); // is this necessary? map.put(m.getGroup(), s); log.debug("Added mapping to map:" + m.getRole()); } } } return map; } public void fromUser(User u) { if (u == null) throw new NullArgumentException("User passed as argument is null!"); setEmailAddress(u.getMail()); } public User asUser() { User u = new User(); u.setDN(getDefaultCertificate().getSubjectString()); u.setCA(getDefaultCertificate().getCa() .getSubjectString()); u.setCN(null); u.setMail(getEmailAddress()); u.setCertUri(null); return u; } public static User[] collectionAsUsers(Collection<VOMSUser> c) { if (c == null || c.isEmpty()) return null; List<User> userList = new ArrayList<User>(); for (VOMSUser u : c) { for (Certificate cert : u.getCertificates()) { User uu = new User(); uu.setDN(cert.getSubjectString()); uu.setCA(cert.getCa() .getSubjectString()); uu.setMail(u.getEmailAddress()); userList.add(uu); } } return userList.toArray(new User[userList.size()]); } public String toString() { ToStringBuilder builder = new ToStringBuilder(this); builder.append("id", id) .append("defaultCertficate", getDefaultCertificate()) .append("name", name) .append("surname", surname) .append("emailAddress", emailAddress) .append("suspended", suspended) .append("endTime", endTime); return builder.toString(); } public boolean equals(Object other) { if (this == other) return true; if (other == null) return false; if (!(other instanceof VOMSUser)) return false; VOMSUser that = (VOMSUser) other; // If name and surname are defined for both parties, // users are considered equal if they have the same: // 1. name // 2. surname // 3. emailAddress // If name or surname aren't defined for a user // the equality check is done on the first certificate. // If no certificate is available, the check is done on the // id if (getName() != null && getSurname() != null) { if (that.getName() != null && that.getSurname() != null) { if (getName().equals(that.getName())) if (getSurname().equals(that.getSurname())) return getEmailAddress().equals(that.getEmailAddress()); return false; } else getDefaultCertificate().equals(that.getDefaultCertificate()); } if (getDefaultCertificate() == null) { if (getId() == null) throw new IllegalStateException( "No information available to compare two users: this=" + this + " , that=" + that); return getId().equals(that.getId()); } return getDefaultCertificate().equals(that.getDefaultCertificate()); } public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder(11, 59); if (getName() != null && getSurname() != null) builder.append(name) .append(surname) .append(emailAddress); else { if (getDefaultCertificate() == null) { if (dn == null) builder.append(id); else builder.append(dn); } else builder.append(getDefaultCertificate().getSubjectString()); } return builder.toHashCode(); } public String getShortName() { if (name == null) { if (getDefaultCertificate() == null) return getDn(); else return getDefaultCertificate().subjectString + "(" + getId() + ")"; } return String.format("%s %s (%d)", name, surname, id); } public Set<Certificate> getCertificates() { return certificates; } public void setCertificates(Set<Certificate> certificates) { this.certificates = certificates; } public void addCertificate(Certificate cert) { if (hasCertificate(cert)) throw new AlreadyExistsException( "Certificate '" + cert + "' is already bound to user '" + this + "'."); getCertificates().add(cert); cert.setUser(this); } public boolean hasCertificate(Certificate cert) { for (Certificate c : certificates) { if (c.equals(cert)) return true; } return false; } public Certificate getCertificate(String subject, String issuer) { for (Certificate c : certificates) { if (c.getSubjectString() .equals(subject) && c.getCa() .getSubjectString() .equals(issuer)) return c; } return null; } public List<Certificate> getCertificatesBySubject(String subject) { List<Certificate> result = new ArrayList<Certificate>(); for (Certificate c : certificates) { if (c.getSubjectString() .equals(subject)) result.add(c); } return result; } public void removeCertificate(Certificate cert) { if (!hasCertificate(cert)) throw new NotFoundException( "Certificate '" + cert + "' is not bound to user '" + this + "'."); getCertificates().remove(cert); } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Date getCreationTime() { return creationTime; } public void setCreationTime(Date creationTime) { this.creationTime = creationTime; } public long getDaysBeforeEndTime() { if (getEndTime() == null) { return Long.MAX_VALUE; } Date now = new Date(); if (now.after(getEndTime())) return -1; long timeDiff = getEndTime().getTime() - now.getTime(); return TimeUnit.MILLISECONDS.toDays(timeDiff); } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public String getInstitution() { return institution; } public void setInstitution(String institution) { this.institution = institution; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getFullName() { return this.getName() + " " + this.getSurname(); } public Certificate getDefaultCertificate() { Iterator<Certificate> iter = getCertificates().iterator(); if (iter.hasNext()) return iter.next(); return null; } public String getEscapedDn() { Certificate cert = getDefaultCertificate(); if (cert == null) return null; return cert.getSubjectString() .replaceAll("'", "\\\\'"); } /** * @return the aupAcceptanceRecords */ public Set<AUPAcceptanceRecord> getAupAcceptanceRecords() { return aupAcceptanceRecords; } /** * @param aupAcceptanceRecords the aupAcceptanceRecords to set */ public void setAupAcceptanceRecords( Set<AUPAcceptanceRecord> aupAcceptanceRecords) { this.aupAcceptanceRecords = aupAcceptanceRecords; } public boolean hasSignedAUP(AUPVersion aupVersion) { for (AUPAcceptanceRecord r : aupAcceptanceRecords) { if (r.getAupVersion() .equals(aupVersion)) return true; } return false; } public AUPAcceptanceRecord getAUPAccceptanceRecord(AUPVersion aupVersion) { for (AUPAcceptanceRecord r : aupAcceptanceRecords) { if (r.getAupVersion() .equals(aupVersion)) return r; } return null; } /** * @return the tasks */ public Set<Task> getTasks() { return tasks; } /** * @param tasks the tasks to set */ public void setTasks(Set<Task> tasks) { this.tasks = tasks; } @Deprecated public String getDn() { // If the default certificate exists for this user, take the dn from // there... if (getDefaultCertificate() != null) { return getDefaultCertificate().getSubjectString(); } // Compatibility behaviour return dn; } @Deprecated public VOMSCA getCa() { if (getDefaultCertificate() != null) { return getDefaultCertificate().getCa(); } return ca; } /** * @return the personalInformations */ public Set<PersonalInformationRecord> getPersonalInformations() { return personalInformations; } /** * @param personalInformations the personalInformations to set */ public void setPersonalInformations( Set<PersonalInformationRecord> personalInformations) { this.personalInformations = personalInformations; } public void setDn(String dn) { this.dn = dn; } public void setCa(VOMSCA ca) { this.ca = ca; } public void assignTask(Task t) { if (!getTasks().contains(t)) { getTasks().add(t); t.setUser(this); } } public Task removeTask(Task t) { if (getTasks().contains(t)) { getTasks().remove(t); t.setUser(null); return t; } return null; } public boolean hasInvalidAUPAcceptanceRecordForAUP(AUP aup) { if (getAupAcceptanceRecords().isEmpty()) return false; for (AUPAcceptanceRecord r : getAupAcceptanceRecords()) { if (r.getAupVersion() .equals(aup.getActiveVersion()) && !r.getValid()) return true; } return false; } public boolean hasInvalidAUPAcceptanceRecord() { if (getAupAcceptanceRecords().isEmpty()) return false; for (AUPAcceptanceRecord r : getAupAcceptanceRecords()) if (!r.getValid()) return true; return false; } public boolean hasPendingSignAUPTasks() { if (getTasks().isEmpty()) return false; for (Task t : getTasks()) if (t instanceof SignAUPTask) { SignAUPTask aupTask = (SignAUPTask) t; if (!aupTask.getStatus() .equals(TaskStatus.COMPLETED)) return true; } return false; } public SignAUPTask getPendingSignAUPTask() { for (Task t : getTasks()) { if (t instanceof SignAUPTask) { SignAUPTask aupTask = (SignAUPTask) t; if (!aupTask.getStatus() .equals(TaskStatus.COMPLETED)) { return aupTask; } } } return null; } public boolean hasPendingSignAUPTask() { if (getTasks().isEmpty()) { return false; } for (Task t : getTasks()) { if (t instanceof SignAUPTask) { SignAUPTask aupTask = (SignAUPTask) t; if (!aupTask.getStatus() .equals(TaskStatus.COMPLETED)) { return true; } } } return false; } public boolean hasPendingSignAUPTask(AUP aup) { if (getTasks().isEmpty()) return false; for (Task t : getTasks()) if (t instanceof SignAUPTask) { SignAUPTask aupTask = (SignAUPTask) t; log.debug("aupTask: " + aupTask); if (aupTask.getAup() .equals(aup) && (!aupTask.getStatus() .equals(TaskStatus.COMPLETED))) { log.debug("Found pending aup task: " + aupTask); return true; } } return false; } public SignAUPTask getPendingSignAUPTask(AUP aup) { if (getTasks().isEmpty()) return null; for (Task t : getTasks()) { if (t instanceof SignAUPTask) { SignAUPTask aupTask = (SignAUPTask) t; if (aupTask.getAup() .equals(aup) && !aupTask.getStatus() .equals(TaskStatus.COMPLETED)) return aupTask; } } return null; } public void suspend(SuspensionReason reason) { setSuspended(true); setSuspensionReasonCode(reason); setSuspensionReason(reason.getMessage()); for (Certificate c : getCertificates()) { // Only suspend certificates that are not already suspended // possibly for another reason. if (!c.isSuspended()) c.suspend(reason); } } /** * Restores membership and certificates that where suspended for the reason * passed as argument * * @param reason */ public void restore(SuspensionReason reason) { setSuspended(false); setSuspensionReason(null); for (Certificate c : getCertificates()) c.restore(reason); } public void restore() { setSuspended(false); setSuspensionReason(null); setSuspensionReasonCode(null); for (Certificate c : getCertificates()) c.restore(); } public boolean isSuspended() { return (suspended == null ? false : suspended); } public Boolean getSuspended() { return suspended; } public void setSuspended(Boolean suspended) { this.suspended = suspended; } public SuspensionReason getSuspensionReasonCode() { return suspensionReasonCode; } public void setSuspensionReasonCode(SuspensionReason suspensionReasonCode) { this.suspensionReasonCode = suspensionReasonCode; } public String getSuspensionReason() { return suspensionReason; } public void setSuspensionReason(String suspensionReason) { this.suspensionReason = suspensionReason; } public boolean hasSuspendedCertificates() { for (Certificate c : certificates) if (c.isSuspended()) return true; return false; } public boolean hasExpired() { if (getEndTime() == null) { return false; } return endTime.before(new Date()); } public long getDaysSinceExpiration() { if (hasExpired()) { Date now = new Date(); long timediff = now.getTime() - getEndTime().getTime(); return TimeUnit.MILLISECONDS.toDays(timediff); } return -1L; } public static VOMSUser fromVOMSUserJSON(VOMSUserJSON user) { VOMSUser u = new VOMSUser(); u.setName(user.getName()); u.setSurname(user.getSurname()); u.setAddress(user.getAddress()); u.setInstitution(user.getInstitution()); u.setPhoneNumber(user.getPhoneNumber()); u.setEmailAddress(user.getEmailAddress()); return u; } public static VOMSUser fromRequesterInfo(RequesterInfo ri) { VOMSUser u = new VOMSUser(); u.setDn(ri.getCertificateSubject()); u.setName(ri.getName()); u.setSurname(ri.getSurname()); u.setAddress(ri.getAddress()); u.setInstitution(ri.getInstitution()); u.setPhoneNumber(ri.getPhoneNumber()); u.setEmailAddress(ri.getEmailAddress()); return u; } @Override public int compareTo(VOMSUser that) { if (that == null) return 1; if (getName() != null && getSurname() != null) { if (that.getName() != null && that.getSurname() != null) { // Both users have name and surname defined, // order by surname and then by name if (getSurname().equals(that.getSurname())) return getName().compareTo(that.getName()); else return getSurname().compareTo(that.getSurname()); } else // One user has name or surname undefined, compare certificates return getDefaultCertificate().compareTo(that.getDefaultCertificate()); } if (getDefaultCertificate() != null) // Both users have name and surname undefined, compare certificates return getDefaultCertificate().compareTo(that.getDefaultCertificate()); return -1; } public Long getOrgDbId() { return orgDbId; } public void setOrgDbId(Long orgDbId) { this.orgDbId = orgDbId; } }