209 lines
5.1 KiB
Java
209 lines
5.1 KiB
Java
package de.hsadmin.mods.email;
|
|
|
|
import static javax.persistence.FetchType.EAGER;
|
|
import static javax.persistence.GenerationType.SEQUENCE;
|
|
|
|
import java.io.Serializable;
|
|
|
|
import javax.persistence.Column;
|
|
import javax.persistence.Entity;
|
|
import javax.persistence.EntityManager;
|
|
import javax.persistence.GeneratedValue;
|
|
import javax.persistence.Id;
|
|
import javax.persistence.JoinColumn;
|
|
import javax.persistence.ManyToOne;
|
|
import javax.persistence.SequenceGenerator;
|
|
import javax.persistence.Table;
|
|
import javax.persistence.Transient;
|
|
|
|
import de.hsadmin.core.model.AbstractEntity;
|
|
import de.hsadmin.core.model.EntityInfo;
|
|
import de.hsadmin.core.model.HSAdminException;
|
|
import de.hsadmin.core.model.SearchFilter;
|
|
import de.hsadmin.mods.dom.Domain;
|
|
import de.hsadmin.mods.user.UnixUser;
|
|
|
|
/**
|
|
* Entity class for email addresses.
|
|
*/
|
|
@Entity(name = "EMailAddresses")
|
|
@Table(name = "emailaddr")
|
|
@SequenceGenerator(name = "EMailAddressesSeqGen", sequenceName = "emailaddr_emailaddr_id_seq")
|
|
@EntityInfo(name = "E-Mail-Adresse")
|
|
@SearchFilter("domain.user = :loginUser OR "
|
|
+ "domain.user.pac = :loginUserPac OR "
|
|
+ "domain.user.pac.customer.name = :loginUserName")
|
|
public class EMailAddress extends AbstractEntity implements Serializable {
|
|
|
|
private static final long serialVersionUID = -2265500181746604429L;
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = SEQUENCE, generator = "EMailAddressesSeqGen")
|
|
@Column(name = "emailaddr_id", columnDefinition = "integer")
|
|
private long id;
|
|
|
|
@Column(name = "localpart", updatable = false, nullable= false)
|
|
private String localpart = "";
|
|
|
|
@Column(name = "subdomain")
|
|
private String subdomain;
|
|
|
|
@ManyToOne(fetch = EAGER)
|
|
@JoinColumn(name = "domain_id", columnDefinition = "integer", updatable = false)
|
|
private Domain domain;
|
|
|
|
@Column(name = "target", nullable= false)
|
|
private String target;
|
|
|
|
public EMailAddress() {
|
|
}
|
|
|
|
public EMailAddress(String localPart, String subdomain, Domain domain,
|
|
String target) {
|
|
this.localpart = localPart;
|
|
this.subdomain = subdomain;
|
|
this.domain = domain;
|
|
this.target = target;
|
|
}
|
|
|
|
public static String createQueryFromStringKey(String humanKey) throws HSAdminException {
|
|
String[] parts = humanKey.split("@", 2);
|
|
if (parts.length != 2) {
|
|
throw new HSAdminException("error in oid: " + humanKey);
|
|
}
|
|
String[] doms = parts[1].split("\\.");
|
|
StringBuilder query = new StringBuilder("localpart='" + parts[0]
|
|
+ "' AND ( ( subdomain IS NULL AND domain.name='" + parts[1]
|
|
+ "' )");
|
|
for (int subdomLevel = 1; subdomLevel < doms.length - 1; ++subdomLevel) {
|
|
String subdom = "";
|
|
for (int n = 0; n < subdomLevel; ++n)
|
|
subdom += "." + doms[n];
|
|
String domain = "";
|
|
for (int n = subdomLevel; n < doms.length; ++n)
|
|
domain += "." + doms[n];
|
|
query.append(" OR ( subdomain='" + subdom.substring(1)
|
|
+ "' AND domain.name='" + domain.substring(1) + "' )");
|
|
}
|
|
query.append(" )");
|
|
String queryString = query.toString();
|
|
return queryString;
|
|
}
|
|
|
|
@Override
|
|
public String createStringKey() {
|
|
String key = getDomain() != null ? (getLocalPart() + "@" + getFullDomain())
|
|
: "?@?";
|
|
return key;
|
|
}
|
|
|
|
@Override
|
|
public long id() {
|
|
return id;
|
|
}
|
|
|
|
public long getId() {
|
|
return id;
|
|
}
|
|
|
|
protected void setId(long id) {
|
|
this.id = id;
|
|
}
|
|
|
|
public String getLocalPart() {
|
|
return localpart == null ? "" : localpart;
|
|
}
|
|
|
|
public void setLocalPart(String localPart) {
|
|
this.localpart = trimToEmpty(localPart);
|
|
}
|
|
|
|
public String getSubdomain() {
|
|
return subdomain == null || subdomain.length() == 0 ? null : subdomain;
|
|
}
|
|
|
|
public void setSubdomain(String subdomain) {
|
|
this.subdomain = trimToNull(subdomain);
|
|
}
|
|
|
|
public Domain getDomain() {
|
|
return domain;
|
|
}
|
|
|
|
public void setDomain(Domain domain) {
|
|
this.domain = domain;
|
|
}
|
|
|
|
public String getTarget() {
|
|
return target;
|
|
}
|
|
|
|
public void setTarget(String target) {
|
|
this.target = trim(target);
|
|
}
|
|
|
|
@Transient
|
|
public String getEMailAddress() {
|
|
return createStringKey();
|
|
}
|
|
|
|
/**
|
|
* returns the full domain (subdomain + domain)
|
|
*/
|
|
@Transient
|
|
public String getFullDomain() {
|
|
return (getSubdomain() == null ? "" : (getSubdomain() + "."))
|
|
+ getDomain().getName();
|
|
}
|
|
|
|
public String toString() {
|
|
if (localpart != null && target != null)
|
|
return super.toString() + "{ id=" + id + "; address=" + localpart
|
|
+ subdomain + "; target=" + target + " }";
|
|
else
|
|
return super.toString();
|
|
}
|
|
|
|
@Override
|
|
public boolean isNew() {
|
|
return id == 0;
|
|
}
|
|
|
|
@Override
|
|
public String getHiveName() {
|
|
if (isNew())
|
|
return null;
|
|
else
|
|
return getDomain().getUser().getHiveName();
|
|
}
|
|
|
|
@Override
|
|
public UnixUser owningUser(EntityManager em) {
|
|
return domain.owningUser(em);
|
|
}
|
|
|
|
@Override
|
|
public boolean isReadAllowedFor(UnixUser loginUser) {
|
|
return getDomain().isReadAllowedFor(loginUser);
|
|
}
|
|
|
|
@Override
|
|
public boolean isWriteAllowedFor(UnixUser loginUser) {
|
|
return getDomain().isWriteAllowedFor(loginUser);
|
|
}
|
|
|
|
/**
|
|
* query restriction for this Entity
|
|
*/
|
|
public static String restriction() {
|
|
return "( " +
|
|
// domain-owner?
|
|
"obj.domain.user = :loginUser OR " +
|
|
// pac-admin? (TODO: Hostsharing name convention)
|
|
"obj.domain.user.pac.name = :loginUserName OR " +
|
|
// customer
|
|
"obj.domain.user.pac.customer.name = :loginUserName )";
|
|
}
|
|
|
|
}
|