diff --git a/hsarback/build.xml b/hsarback/build.xml
index 80c9b57..a6bb7e4 100644
--- a/hsarback/build.xml
+++ b/hsarback/build.xml
@@ -39,7 +39,7 @@
-
+
diff --git a/hsarback/database/database_update.sql b/hsarback/database/database_update.sql
index e69de29..3f3f5dd 100644
--- a/hsarback/database/database_update.sql
+++ b/hsarback/database/database_update.sql
@@ -0,0 +1,80 @@
+-- Migrate database from version 2.1 to version 2.2
+--
+-- domain options
+--
+CREATE SEQUENCE domain_option_id_seq
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+CREATE TABLE domain_option (
+ domain_option_id integer DEFAULT nextval(('"domain_option_id_seq"'::text)::regclass) NOT NULL,
+ domain_option_name character varying(50) NOT NULL
+);
+
+ALTER TABLE ONLY domain_option
+ ADD CONSTRAINT pk_domain_option PRIMARY KEY (domain_option_id);
+
+CREATE UNIQUE INDEX domain_option_name_idx ON domain_option USING btree ( domain_option_name );
+
+CREATE TABLE domain__domain_option (
+ domain_option_id integer NOT NULL,
+ domain_id integer NOT NULL
+);
+
+ALTER TABLE ONLY domain__domain_option
+ ADD CONSTRAINT pk_domain__domain_option PRIMARY KEY (domain_option_id, domain_id);
+
+ALTER TABLE ONLY domain__domain_option
+ ADD CONSTRAINT domain_option_id_fkey FOREIGN KEY (domain_option_id)
+ REFERENCES domain_option(domain_option_id) DEFERRABLE;
+
+ALTER TABLE ONLY domain__domain_option
+ ADD CONSTRAINT domain_id_fkey FOREIGN KEY (domain_id)
+ REFERENCES domain(domain_id) DEFERRABLE;
+
+--
+-- table: domain_option
+--
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('backupmxforexternalmx');
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('greylisting');
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('htdocsfallback');
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('includes');
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('indexes');
+INSERT INTO domain_option (domain_option_name)
+ VALUES ('multiviews');
+--
+-- new domain options settings
+--
+-- existing default = ON
+--
+INSERT INTO domain__domain_option SELECT domain_option_id, domain_id
+ FROM domain, domain_option
+ WHERE domain_option.domain_option_name = 'greylisting' ;
+INSERT INTO domain__domain_option SELECT domain_option_id, domain_id
+ FROM domain, domain_option
+ WHERE domain_option.domain_option_name = 'htdocsfalback' ;
+INSERT INTO domain__domain_option SELECT domain_option_id, domain_id
+ FROM domain, domain_option
+ WHERE domain_option.domain_option_name = 'includes' ;
+INSERT INTO domain__domain_option SELECT domain_option_id, domain_id
+ FROM domain, domain_option
+ WHERE domain_option.domain_option_name = 'indexes' ;
+INSERT INTO domain__domain_option SELECT domain_option_id, domain_id
+ FROM domain, domain_option
+ WHERE domain_option.domain_option_name = 'multiviews' ;
+--
+-- existing default = OFF
+--
+DELETE FROM domain__domain_option USING domain_option
+ WHERE domain__domain_option.domain_option_id = domain_option.domain_option_id
+ AND domain_option.domain_option_name = 'backupmxforexternalmx' ;
+--
+-- End of migratino to version 2.2
+--
diff --git a/hsarback/database/schema.sql b/hsarback/database/schema.sql
index 0424bd4..80bd3ac 100644
--- a/hsarback/database/schema.sql
+++ b/hsarback/database/schema.sql
@@ -900,6 +900,10 @@ ALTER TABLE ONLY component
ALTER TABLE ONLY queue_task
ADD CONSTRAINT queue_task_user_id_fkey FOREIGN KEY (user_id) REFERENCES unixuser(unixuser_id) ON DELETE SET NULL;
+--
+-- domain options
+--
+
CREATE SEQUENCE domain_option_id_seq
INCREMENT BY 1
NO MAXVALUE
diff --git a/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java b/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java
index 4e4e983..be6a826 100644
--- a/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java
+++ b/hsarback/src/de/hsadmin/mods/dom/DomainProcessorFactory.java
@@ -27,8 +27,13 @@ import de.hsadmin.mods.user.UnixUser;
public class DomainProcessorFactory implements EntityProcessorFactory {
- private static final String[] DW_STRUCTURE = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "cgi", "fastcgi", "cgi-ssl", "fastcgi-ssl", "etc", "var" };
- private static final String[] SW_STRUCTURE = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "etc", "var" };
+ private static final String[] DW_STRUCTURE = new String[] {
+ "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "cgi", "fastcgi", "cgi-ssl", "fastcgi-ssl", "etc", "var"
+ };
+
+ private static final String[] SW_STRUCTURE = new String[] {
+ "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "etc", "var"
+ };
public Processor createCreateProcessor(EntityManager em, T entity) throws ProcessorException {
String hiveName = entity.getHiveName();
diff --git a/hsarback/src/de/hsadmin/mods/pac/Pac.java b/hsarback/src/de/hsadmin/mods/pac/Pac.java
index 28b8532..746811c 100644
--- a/hsarback/src/de/hsadmin/mods/pac/Pac.java
+++ b/hsarback/src/de/hsadmin/mods/pac/Pac.java
@@ -75,7 +75,7 @@ public class Pac extends AbstractEntity implements Serializable {
@ManyToOne(fetch = EAGER)
private INetAddress oldINetAddr;
- @OneToMany(fetch = LAZY, cascade = ALL, mappedBy="pac")
+ @OneToMany(fetch = EAGER, cascade = ALL, mappedBy="pac")
private Set pacComponents;
@OneToMany(fetch = LAZY, cascade = ALL, mappedBy="pac")
diff --git a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
index c3d848c..32ae06f 100644
--- a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
+++ b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java
@@ -110,9 +110,16 @@ public class PacModuleImpl extends AbstractModuleImpl {
}
@Override
- public AbstractEntity update(AbstractEntity existingEntity)
+ public AbstractEntity update(AbstractEntity entity)
throws HSAdminException {
- throw new AuthorisationException(getTransaction().getLoginUser(), "update", existingEntity);
+ UnixUser loginUser = getTransaction().getLoginUser();
+ if (entity instanceof Pac) {
+ Pac pac = (Pac) entity;
+ } else {
+ throw new AuthorisationException(loginUser, "update", entity);
+ }
+ needsWriteAccessOn(entity, "update");
+ return super.update(entity);
}
@Override
@@ -154,4 +161,19 @@ public class PacModuleImpl extends AbstractModuleImpl {
super.delete(existingEntity);
}
+ private void needsWriteAccessOn(AbstractEntity entity, String method) throws AuthorisationException {
+ UnixUser loginUser = getTransaction().getLoginUser();
+ if (entity instanceof Pac) {
+ Pac pac = (Pac) entity;
+ String aLoginUserName = loginUser.getName();
+ boolean isPacAdmin = loginUser.hasPacAdminRoleFor(pac);
+ boolean isCustomer = aLoginUserName.equals(pac.getCustomer().getName());
+ boolean isHostmaster = loginUser.hasHostmasterRole();
+ if (!isPacAdmin && !isCustomer && !isHostmaster) {
+ throw new AuthorisationException(loginUser, method, pac);
+ }
+ } else {
+ throw new AuthorisationException(loginUser, method, entity);
+ }
+ }
}
diff --git a/hsarback/src/de/hsadmin/mods/user/UnixUser.java b/hsarback/src/de/hsadmin/mods/user/UnixUser.java
index a23b060..3a60bad 100644
--- a/hsarback/src/de/hsadmin/mods/user/UnixUser.java
+++ b/hsarback/src/de/hsadmin/mods/user/UnixUser.java
@@ -275,7 +275,7 @@ public class UnixUser extends AbstractEntity implements Serializable {
return getName().equals(cust.getName()) || hasHostmasterRole();
}
- public boolean hasPacAdminRoleFor(de.hsadmin.mods.pac.Pac pac) {
+ public boolean hasPacAdminRoleFor(Pac pac) {
return pac != null &&
(pac.getName().equals(getName())
|| hasCustomerRoleFor(pac.getCustomer()) );
diff --git a/hsarback/src/de/hsadmin/remote/PacRemote.java b/hsarback/src/de/hsadmin/remote/PacRemote.java
index cb6ca52..9008a76 100644
--- a/hsarback/src/de/hsadmin/remote/PacRemote.java
+++ b/hsarback/src/de/hsadmin/remote/PacRemote.java
@@ -1,10 +1,9 @@
package de.hsadmin.remote;
-import java.util.Comparator;
import java.util.Date;
+import java.util.HashMap;
import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
+import java.util.Set;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.util.TextUtil;
@@ -27,27 +26,38 @@ public class PacRemote extends AbstractRemote {
resultMap.put("curinetaddr", pac.getCurINetAddr().getInetAddr());
resultMap.put("created", TextUtil.format(pac.getCreated()));
resultMap.put("basepac", pac.getBasepac().getName());
- SortedSet sortedComponents = new TreeSet(new Comparator() {
- @Override
- public int compare(PacComponent o1, PacComponent o2) {
- return o2.getBaseComponent().getSorting() - o1.getBaseComponent().getSorting();
- }
- });
- sortedComponents.addAll(pac.getPacComponents());
- StringBuffer bf = new StringBuffer();
- boolean empty = true;
- for (PacComponent comp : sortedComponents) {
- if (comp.getQuantity() > 0) {
- if (!empty) {
- bf.append("; ");
- }
- bf.append(comp.getBaseComponent().getFeature());
- bf.append("=");
- bf.append(comp.getQuantity());
- empty = false;
+
+ Map components = new HashMap();
+ Set pacComponents = pac.getPacComponents();
+ for (PacComponent comp : pacComponents) {
+ int quantity = comp.getQuantity();
+ if (quantity > 0) {
+ components.put(comp.getBaseComponent().getFeature(), Integer.toString(quantity));
}
}
- resultMap.put("components", bf.toString());
+ resultMap.put("components", components);
+
+// SortedSet sortedComponents = new TreeSet(new Comparator() {
+// @Override
+// public int compare(PacComponent o1, PacComponent o2) {
+// return o2.getBaseComponent().getSorting() - o1.getBaseComponent().getSorting();
+// }
+// });
+// sortedComponents.addAll(pac.getPacComponents());
+// StringBuffer bf = new StringBuffer();
+// boolean empty = true;
+// for (PacComponent comp : sortedComponents) {
+// if (comp.getQuantity() > 0) {
+// if (!empty) {
+// bf.append("; ");
+// }
+// bf.append(comp.getBaseComponent().getFeature());
+// bf.append("=");
+// bf.append(comp.getQuantity());
+// empty = false;
+// }
+// }
+// resultMap.put("components", bf.toString());
}
@Override
@@ -86,7 +96,17 @@ public class PacRemote extends AbstractRemote {
hive.setName(hiveName);
pac.setHive(hive);
}
- pac.setName((String) setParams.get("name"));
+ Object componentsObj = setParams.get("components");
+ if (componentsObj != null && componentsObj instanceof Map) {
+ Map, ?> componentsMap = (Map, ?>) componentsObj;
+ for (Object key : componentsMap.keySet()) {
+ pac.getPacComponent(key.toString()).setQuantity(Integer.parseInt(componentsMap.get(key).toString()));
+ }
+ }
+ Object nameParamObj = setParams.get("name");
+ if (nameParamObj != null && nameParamObj instanceof String) {
+ pac.setName((String) nameParamObj);
+ }
}
@Override