/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.security.impl.jpa; import org.opencastproject.security.api.Organization; import org.opencastproject.security.api.Role; import org.opencastproject.security.api.User; import org.opencastproject.util.EqualsUtil; import java.util.HashSet; import java.util.Set; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; /** * JPA-annotated user object. */ @Entity @Access(AccessType.FIELD) @Table(name = "mh_user", uniqueConstraints = { @UniqueConstraint(columnNames = { "username", "organization" }) }) @NamedQueries({ @NamedQuery(name = "User.findByQuery", query = "select u from JpaUser u where UPPER(u.username) like :query and u.organization.id = :org"), @NamedQuery(name = "User.findByIdAndOrg", query = "select u from JpaUser u where u.id=:id and u.organization.id = :org"), @NamedQuery(name = "User.findByUsername", query = "select u from JpaUser u where u.username=:u and u.organization.id = :org"), @NamedQuery(name = "User.findAll", query = "select u from JpaUser u where u.organization.id = :org"), @NamedQuery(name = "User.countAll", query = "select COUNT(u) from JpaUser u where u.organization.id = :org") }) public class JpaUser implements User { @Id @GeneratedValue @Column(name = "id") private Long id; @Column(name = "username", length = 128) private String username; @Column(name = "name") private String name; @Column(name = "email") private String email; @Column(name = "manageable") private boolean manageable = true; @Transient private String provider; @Lob @Column(name = "password", length = 65535) private String password; @OneToOne() @JoinColumn(name = "organization") private JpaOrganization organization; @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.EAGER) @JoinTable(name = "mh_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }, uniqueConstraints = { @UniqueConstraint(columnNames = { "user_id", "role_id" }) }) private Set<JpaRole> roles; /** * No-arg constructor needed by JPA */ public JpaUser() { } /** * Constructs a user with the specified username, password, name, email and provider. * * @param username * the username * @param password * the password * @param organization * the organization * @param name * the name * @param email * the email * @param provider * the provider * @param manageable * whether the user is manageable */ public JpaUser(String username, String password, JpaOrganization organization, String name, String email, String provider, boolean manageable) { super(); this.username = username; this.password = password; this.organization = organization; this.name = name; this.email = email; this.provider = provider; this.manageable = manageable; this.roles = new HashSet<JpaRole>(); } /** * Constructs a user with the specified username, password, provider and roles. * * @param username * the username * @param password * the password * @param organization * the organization * @param provider * the provider * @param manageable * whether the user is manageable * @param roles * the roles */ public JpaUser(String username, String password, JpaOrganization organization, String provider, boolean manageable, Set<JpaRole> roles) { this(username, password, organization, null, null, provider, manageable); for (Role role : roles) { if (role.getOrganization() == null || !organization.getId().equals(role.getOrganization().getId())) throw new IllegalArgumentException("Role " + role + " is not from the same organization!"); } this.roles = roles; } /** * Constructs a user with the specified username, password, name, email, provider and roles. * * @param username * the username * @param password * the password * @param organization * the organization * @param name * the name * @param email * the email * @param provider * the provider * @param manageable * whether the user is manageable * @param roles * the roles */ public JpaUser(String username, String password, JpaOrganization organization, String name, String email, String provider, boolean manageable, Set<JpaRole> roles) { this(username, password, organization, name, email, provider, manageable); for (Role role : roles) { if (role.getOrganization() == null || !organization.getId().equals(role.getOrganization().getId())) throw new IllegalArgumentException("Role " + role + " is not from the same organization!"); } this.roles = roles; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * Gets this user's clear text password. * * @return the user account's password */ @Override public String getPassword() { return password; } /** * @see org.opencastproject.security.api.User#canLogin() */ @Override public boolean canLogin() { return true; } /** * @see org.opencastproject.security.api.User#getUsername() */ @Override public String getUsername() { return username; } /** * @see org.opencastproject.security.api.User#hasRole(String) */ @Override public boolean hasRole(String roleName) { for (Role role : roles) { if (role.getName().equals(roleName)) return true; } return false; } /** * @see org.opencastproject.security.api.User#getOrganization() */ @Override public Organization getOrganization() { return organization; } /** * @see org.opencastproject.security.api.User#getRoles() */ @Override public Set<Role> getRoles() { return new HashSet<Role>(roles); } /** * {@inheritDoc} * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (!(obj instanceof User)) return false; User other = (User) obj; return username.equals(other.getUsername()) && organization.equals(other.getOrganization()) && EqualsUtil.eq(provider, other.getProvider()); } /** * {@inheritDoc} * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return EqualsUtil.hash(username, organization, provider); } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return new StringBuilder(username).append(":").append(organization).append(":").append(provider).toString(); } @Override public String getName() { return name; } @Override public String getEmail() { return email; } @Override public String getProvider() { return provider; } public void setProvider(String provider) { this.provider = provider; } @Override public boolean isManageable() { return manageable; } public void setManageable(boolean isManageable) { this.manageable = isManageable; } }