diff options
13 files changed, 401 insertions, 313 deletions
diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java index c3876bf83..9c707e494 100644 --- a/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java +++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java @@ -44,17 +44,13 @@ public class ConfigClient extends Client { resource = createProxy(ConfigResource.class); } - public ConfigCollection findConfigs() { - return resource.findConfigs(); + public ConfigData getConfig() { + return resource.getConfig(); } - public ConfigData getConfig(String configID) { - return resource.getConfig(configID); - } - - public ConfigData updateConfig(String configID, ConfigData configData) { + public ConfigData updateConfig(ConfigData configData) { @SuppressWarnings("unchecked") - ClientResponse<ConfigData> response = (ClientResponse<ConfigData>)resource.updateConfig(configID, configData); + ClientResponse<ConfigData> response = (ClientResponse<ConfigData>)resource.updateConfig(configData); return client.getEntity(response); } } diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java index 1b3688f5e..2a36f3fa8 100644 --- a/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java +++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java @@ -57,27 +57,18 @@ public class ConfigData { } } - String id; - String displayName; + String status; Map<String, String> properties = new LinkedHashMap<String, String>(); - Link link; - - @XmlAttribute(name="id") - public String getID() { - return id; - } - public void setID(String id) { - this.id = id; - } + Link link; - @XmlElement(name="DisplayName") - public String getDisplayName() { - return displayName; + @XmlElement(name="Status") + public String getStatus() { + return status; } - public void setDisplayName(String displayName) { - this.displayName = displayName; + public void setStatus(String status) { + this.status = status; } @XmlElement(name="Properties") @@ -156,10 +147,9 @@ public class ConfigData { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((displayName == null) ? 0 : displayName.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((link == null) ? 0 : link.hashCode()); result = prime * result + ((properties == null) ? 0 : properties.hashCode()); + result = prime * result + ((status == null) ? 0 : status.hashCode()); return result; } @@ -172,16 +162,6 @@ public class ConfigData { if (getClass() != obj.getClass()) return false; ConfigData other = (ConfigData) obj; - if (displayName == null) { - if (other.displayName != null) - return false; - } else if (!displayName.equals(other.displayName)) - return false; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; if (link == null) { if (other.link != null) return false; @@ -192,6 +172,11 @@ public class ConfigData { return false; } else if (!properties.equals(other.properties)) return false; + if (status == null) { + if (other.status != null) + return false; + } else if (!status.equals(other.status)) + return false; return true; } @@ -217,8 +202,7 @@ public class ConfigData { public static void main(String args[]) throws Exception { ConfigData before = new ConfigData(); - before.setID("test"); - before.setDisplayName("Test Config"); + before.setStatus("ENABLED"); before.setProperty("param1", "value1"); before.setProperty("param2", "value2"); diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java index a15730a4b..e1076a48e 100644 --- a/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java +++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java @@ -21,7 +21,6 @@ import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -32,22 +31,16 @@ import org.jboss.resteasy.annotations.ClientResponseType; /** * @author Endi S. Dewata */ -@Path("configs") +@Path("config") public interface ConfigResource { @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public ConfigCollection findConfigs(); - - @GET - @Path("{configID}") - @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public ConfigData getConfig(@PathParam("configID") String configID); + public ConfigData getConfig(); @PUT - @Path("{configID}") @ClientResponseType(entityType=ConfigData.class) @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public Response updateConfig(@PathParam("configID") String configID, ConfigData configData); + public Response updateConfig(ConfigData configData); } diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java index 9d913517e..584cf81af 100644 --- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java @@ -19,7 +19,7 @@ package com.netscape.cmstools.tps.config; import java.io.IOException; -import java.util.Arrays; +import java.util.Map; import org.jboss.resteasy.plugins.providers.atom.Link; @@ -37,7 +37,6 @@ public class ConfigCLI extends CLI { public ConfigCLI(CLI parent) { super("config", "Configuration management commands", parent); - addModule(new ConfigFindCLI(this)); addModule(new ConfigModifyCLI(this)); addModule(new ConfigShowCLI(this)); } @@ -47,41 +46,18 @@ public class ConfigCLI extends CLI { client = parent.getClient(); configClient = (ConfigClient)parent.getClient("config"); - if (args.length == 0) { - printHelp(); - System.exit(1); - } - - String command = args[0]; - String[] commandArgs = Arrays.copyOfRange(args, 1, args.length); - - if (command == null) { - printHelp(); - System.exit(1); - } - - CLI module = getModule(command); - if (module != null) { - module.execute(commandArgs); - - } else { - System.err.println("Error: Invalid command \"" + command + "\""); - printHelp(); - System.exit(1); - } + super.execute(args); } - public static void printConfigData(ConfigData configData, boolean showProperties) throws IOException { + public static void printConfigData(ConfigData configData) throws IOException { - System.out.println(" Config ID: " + configData.getID()); - System.out.println(" Display Name: " + configData.getDisplayName()); + if (configData.getStatus() != null) System.out.println(" Status: " + configData.getStatus()); - if (showProperties) { - System.out.println(" Properties:"); - for (String name : configData.getPropertyNames()) { - String value = configData.getProperty(name); - System.out.println(" " + name + ": " + value); - } + System.out.println(" Properties:"); + Map<String, String> properties = configData.getProperties(); + for (String name : properties.keySet()) { + String value = properties.get(name); + System.out.println(" " + name + ": " + value); } Link link = configData.getLink(); diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java deleted file mode 100644 index c7ab18738..000000000 --- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java +++ /dev/null @@ -1,86 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2013 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- - -package com.netscape.cmstools.tps.config; - -import java.util.Collection; - -import org.apache.commons.cli.CommandLine; - -import com.netscape.certsrv.tps.config.ConfigCollection; -import com.netscape.certsrv.tps.config.ConfigData; -import com.netscape.cmstools.cli.CLI; -import com.netscape.cmstools.cli.MainCLI; - -/** - * @author Endi S. Dewata - */ -public class ConfigFindCLI extends CLI { - - public ConfigCLI configCLI; - - public ConfigFindCLI(ConfigCLI configCLI) { - super("find", "Find configurations", configCLI); - this.configCLI = configCLI; - } - - public void printHelp() { - formatter.printHelp(getFullName(), options); - } - - public void execute(String[] args) throws Exception { - - CommandLine cmd = null; - - try { - cmd = parser.parse(options, args); - - } catch (Exception e) { - System.err.println("Error: " + e.getMessage()); - printHelp(); - System.exit(1); - } - - String[] cmdArgs = cmd.getArgs(); - - if (cmdArgs.length != 0) { - printHelp(); - System.exit(1); - } - - ConfigCollection result = configCLI.configClient.findConfigs(); - - Collection<ConfigData> entries = result.getConfigs(); - - MainCLI.printMessage(entries.size() + " entries matched"); - boolean first = true; - - for (ConfigData configData : entries) { - - if (first) { - first = false; - } else { - System.out.println(); - } - - ConfigCLI.printConfigData(configData, false); - } - - MainCLI.printMessage("Number of entries returned " + entries.size()); - } -} diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java index 3344a8c9e..fb7e2f09f 100644 --- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java @@ -39,22 +39,22 @@ public class ConfigModifyCLI extends CLI { public ConfigCLI configCLI; public ConfigModifyCLI(ConfigCLI configCLI) { - super("mod", "Modify configuration", configCLI); + super("mod", "Modify general properties", configCLI); this.configCLI = configCLI; } public void printHelp() { - formatter.printHelp(getFullName() + " <Config ID> [OPTIONS...]", options); + formatter.printHelp(getFullName() + " [OPTIONS...]", options); } public void execute(String[] args) throws Exception { - Option option = new Option(null, "input", true, "Input configuration file."); + Option option = new Option(null, "input", true, "Input file containing general properties."); option.setArgName("file"); option.setRequired(true); options.addOption(option); - option = new Option(null, "output", true, "Output configuration file."); + option = new Option(null, "output", true, "Output file to store general properties."); option.setArgName("file"); options.addOption(option); @@ -71,12 +71,11 @@ public class ConfigModifyCLI extends CLI { String[] cmdArgs = cmd.getArgs(); - if (cmdArgs.length != 1) { + if (cmdArgs.length != 0) { printHelp(); System.exit(1); } - String configID = args[0]; String input = cmd.getOptionValue("input"); String output = cmd.getOptionValue("output"); @@ -100,12 +99,12 @@ public class ConfigModifyCLI extends CLI { configData = ConfigData.valueOf(sw.toString()); } - configData = configCLI.configClient.updateConfig(configID, configData); + configData = configCLI.configClient.updateConfig(configData); MainCLI.printMessage("Updated configuration"); if (output == null) { - ConfigCLI.printConfigData(configData, true); + ConfigCLI.printConfigData(configData); } else { try (PrintWriter out = new PrintWriter(new FileWriter(output))) { diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java index 77f77c94f..33bc781ac 100644 --- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java @@ -36,17 +36,17 @@ public class ConfigShowCLI extends CLI { public ConfigCLI configCLI; public ConfigShowCLI(ConfigCLI configCLI) { - super("show", "Show configuration", configCLI); + super("show", "Show general properties", configCLI); this.configCLI = configCLI; } public void printHelp() { - formatter.printHelp(getFullName() + " <Config ID>", options); + formatter.printHelp(getFullName(), options); } public void execute(String[] args) throws Exception { - Option option = new Option(null, "output", true, "Output file to store config attributes."); + Option option = new Option(null, "output", true, "Output file to store general properties."); option.setArgName("file"); options.addOption(option); @@ -63,19 +63,18 @@ public class ConfigShowCLI extends CLI { String[] cmdArgs = cmd.getArgs(); - if (cmdArgs.length != 1) { + if (cmdArgs.length != 0) { printHelp(); System.exit(1); } - String configID = cmdArgs[0]; String output = cmd.getOptionValue("output"); - ConfigData configData = configCLI.configClient.getConfig(configID); + ConfigData configData = configCLI.configClient.getConfig(); if (output == null) { MainCLI.printMessage("Configuration"); - ConfigCLI.printConfigData(configData, true); + ConfigCLI.printConfigData(configData); } else { try (PrintWriter out = new PrintWriter(new FileWriter(output))) { diff --git a/base/tps-tomcat/src/CMakeLists.txt b/base/tps-tomcat/src/CMakeLists.txt index 4798d2004..a0a7ac505 100644 --- a/base/tps-tomcat/src/CMakeLists.txt +++ b/base/tps-tomcat/src/CMakeLists.txt @@ -1,5 +1,12 @@ project(pki-tps_java NONE) +find_file(APACHE_COMMONS_LANG_JAR + NAMES + apache-commons-lang.jar + PATHS + /usr/share/java +) + find_file(LDAPJDK_JAR NAMES ldapjdk.jar @@ -100,7 +107,7 @@ javac(pki-tps-classes CLASSPATH ${PKI_CERTSRV_JAR} ${PKI_CMS_JAR} ${PKI_CMSCORE_JAR} ${PKI_CMSUTIL_JAR} ${PKI_NSUTIL_JAR} - ${LDAPJDK_JAR} ${JAXRS_API_JAR} ${RESTEASY_ATOM_PROVIDER_JAR} + ${APACHE_COMMONS_LANG_JAR} ${LDAPJDK_JAR} ${JAXRS_API_JAR} ${RESTEASY_ATOM_PROVIDER_JAR} ${JSS_JAR} ${COMMONS_CODEC_JAR} ${SYMKEY_JAR} ${SERVLET_JAR} OUTPUT_DIR ${CMAKE_BINARY_DIR}/classes diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java index c3c6195f5..e90d8bbcc 100644 --- a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java +++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java @@ -73,15 +73,15 @@ public class TPSApplication extends Application { // authenticators classes.add(AuthenticatorService.class); + // certificates + classes.add(TPSCertService.class); + // config classes.add(ConfigService.class); // connections classes.add(ConnectionService.class); - // certificates - classes.add(TPSCertService.class); - // tokens classes.add(TokenService.class); diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java index d00378a1d..58ed12233 100644 --- a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java +++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java @@ -19,6 +19,7 @@ package org.dogtagpki.server.tps; import org.dogtagpki.server.tps.authenticator.AuthenticatorDatabase; import org.dogtagpki.server.tps.cert.TPSCertDatabase; +import org.dogtagpki.server.tps.config.ConfigDatabase; import org.dogtagpki.server.tps.connection.ConnectionDatabase; import org.dogtagpki.server.tps.logging.ActivityDatabase; import org.dogtagpki.server.tps.token.TokenDatabase; @@ -53,9 +54,10 @@ public class TPSSubsystem implements IAuthority, ISubsystem { public IConfigStore config; public ActivityDatabase activityDatabase; - public AuthenticatorDatabase authenticatorDatabase = new AuthenticatorDatabase(); + public AuthenticatorDatabase authenticatorDatabase; public TPSCertDatabase certDatabase; - public ConnectionDatabase connectionDatabase = new ConnectionDatabase(); + public ConfigDatabase configDatabase; + public ConnectionDatabase connectionDatabase; public TokenDatabase tokenDatabase; @Override @@ -84,7 +86,11 @@ public class TPSSubsystem implements IAuthority, ISubsystem { String tokenDatabaseDN = cs.getString("tokendb.baseDN"); tokenDatabase = new TokenDatabase(dbSubsystem, tokenDatabaseDN); - } + + configDatabase = new ConfigDatabase(); + authenticatorDatabase = new AuthenticatorDatabase(); + connectionDatabase = new ConnectionDatabase(); +} @Override public void startup() throws EBaseException { @@ -139,14 +145,18 @@ public class TPSSubsystem implements IAuthority, ISubsystem { return authenticatorDatabase; } - public ConnectionDatabase getConnectionDatabase() { - return connectionDatabase; - } - public TPSCertDatabase getCertDatabase() { return certDatabase; } + public ConfigDatabase getConfigDatabase() { + return configDatabase; + } + + public ConnectionDatabase getConnectionDatabase() { + return connectionDatabase; + } + public TokenDatabase getTokenDatabase() { return tokenDatabase; } diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java new file mode 100644 index 000000000..8a3850165 --- /dev/null +++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java @@ -0,0 +1,191 @@ +// --- BEGIN COPYRIGHT BLOCK --- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (C) 2013 Red Hat, Inc. +// All rights reserved. +// --- END COPYRIGHT BLOCK --- + +package org.dogtagpki.server.tps.config; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.commons.lang.StringUtils; + +import com.netscape.certsrv.apps.CMS; +import com.netscape.certsrv.base.BadRequestException; +import com.netscape.certsrv.base.EBaseException; +import com.netscape.certsrv.base.IConfigStore; +import com.netscape.certsrv.base.ResourceNotFoundException; +import com.netscape.cmscore.dbs.Database; + +/** + * This class implements in-memory connection database. In the future this + * will be replaced with LDAP database. + * + * @author Endi S. Dewata + */ +public class ConfigDatabase extends Database<ConfigRecord> { + + IConfigStore configStore = CMS.getConfigStore(); + Map<String, String> map; + + public ConfigDatabase() throws EBaseException { + super("Configuration"); + + map = configStore.getProperties(); + } + + public String createFilter(ConfigRecord record, String key) { + String pattern = record.getPattern(); + if (key == null) return pattern; + return pattern.replace("$name", key); + } + + @Override + public Collection<ConfigRecord> getRecords() throws Exception { + + CMS.debug("ConfigDatabase.getRecords()"); + + Collection<ConfigRecord> result = new ArrayList<ConfigRecord>(); + + Collection<String> configIDs = new LinkedHashSet<String>(); + configIDs.add("Generals"); + + String list = map.get("target.configure.list"); + if (list != null) { + configIDs.addAll(Arrays.asList(list.split(","))); + } + + list = map.get("target.agent_approve.list"); + if (list != null) { + configIDs.addAll(Arrays.asList(list.split(","))); + } + + for (String configID : configIDs) { + ConfigRecord configData = getRecord(configID); + result.add(configData); + } + + return result; + } + + @Override + public ConfigRecord getRecord(String configID) throws Exception { + + CMS.debug("ConfigDatabase.getRecord(\"" + configID + "\")"); + + ConfigRecord record = new ConfigRecord(); + record.setID(configID); + + String displayName = map.get("target." + configID + ".displayname"); + if (displayName == null) { + throw new ResourceNotFoundException("Configuration " + configID + " not found."); + } + record.setDisplayName(displayName); + + String pattern = map.get("target." + configID + ".pattern"); + if (pattern == null) { + throw new ResourceNotFoundException("Missing pattern for " + configID + " configuration."); + } + + // replace \| with | + record.setPattern(pattern.replace("\\|", "|")); + + String list = map.get("target." + configID + ".list"); + if (list != null) { + record.setKeys(Arrays.asList(list.split(","))); + } + + return record; + } + + + @Override + public void updateRecord(String configID, ConfigRecord newRecord) throws Exception { + + CMS.debug("ConfigDatabase.updateRecord(\"" + configID + "\")"); + + configStore.put("target." + configID + ".displayname", newRecord.getDisplayName()); + configStore.put("target." + configID + ".pattern", newRecord.getPattern()); + configStore.put("target." + configID + ".list", StringUtils.join(newRecord.getKeys(), ",")); + + configStore.commit(true); + map = configStore.getProperties(); + } + + public Map<String, String> getProperties(ConfigRecord record, String key) { + + CMS.debug("ConfigDatabase.getProperties(\"" + record.getID() + "\")"); + + Map<String, String> properties = new TreeMap<String, String>(); + + // get properties that match the filter + String filter = createFilter(record, key); + for (String name : map.keySet()) { + if (!name.matches(filter)) continue; + + String value = map.get(name); + properties.put(name, value); + } + + return properties; + } + + public void validateProperties(ConfigRecord record, String key, Map<String, String> properties) throws Exception { + + CMS.debug("ConfigDatabase.validateProperties(\"" + record.getID() + "\")"); + + String filter = createFilter(record, key); + for (String name : properties.keySet()) { + if (name.matches(filter)) continue; + throw new BadRequestException("Invalid property: " + name); + } + } + + public void addProperties(ConfigRecord record, String key, Map<String, String> properties) throws Exception { + + CMS.debug("ConfigDatabase.addProperties(\"" + record.getID() + "\")"); + + for (String name : properties.keySet()) { + String value = properties.get(name); + configStore.put(name, value); + } + } + + public void removeProperties(ConfigRecord record, String key) throws Exception { + + CMS.debug("ConfigDatabase.removeProperties(\"" + record.getID() + "\")"); + + Map<String, String> oldProperties = getProperties(record, key); + for (String name : oldProperties.keySet()) { + configStore.remove(name); + } + } + + public void commit() throws Exception { + + CMS.debug("ConfigDatabase.commit()"); + + // save configuration + configStore.commit(true); + + // reload configuration + map = configStore.getProperties(); + } +} diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java new file mode 100644 index 000000000..25978212e --- /dev/null +++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java @@ -0,0 +1,117 @@ +// --- BEGIN COPYRIGHT BLOCK --- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (C) 2013 Red Hat, Inc. +// All rights reserved. +// --- END COPYRIGHT BLOCK --- + +package org.dogtagpki.server.tps.config; + +import java.util.Collection; +import java.util.LinkedHashSet; + +/** + * @author Endi S. Dewata + */ +public class ConfigRecord { + + String id; + String displayName; + String pattern; + Collection<String> keys = new LinkedHashSet<String>(); + + public String getID() { + return id; + } + + public void setID(String id) { + this.id = id; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public Collection<String> getKeys() { + return keys; + } + + public void setKeys(Collection<String> keys) { + this.keys.clear(); + this.keys.addAll(keys); + } + + public void addKey(String key) { + keys.add(key); + } + + public void removeKey(String key) { + keys.remove(key); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((displayName == null) ? 0 : displayName.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((keys == null) ? 0 : keys.hashCode()); + result = prime * result + ((pattern == null) ? 0 : pattern.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConfigRecord other = (ConfigRecord) obj; + if (displayName == null) { + if (other.displayName != null) + return false; + } else if (!displayName.equals(other.displayName)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (keys == null) { + if (other.keys != null) + return false; + } else if (!keys.equals(other.keys)) + return false; + if (pattern == null) { + if (other.pattern != null) + return false; + } else if (!pattern.equals(other.pattern)) + return false; + return true; + } +} diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java index 41a8c1714..8f338e330 100644 --- a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java +++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java @@ -20,11 +20,6 @@ package org.dogtagpki.server.tps.config; import java.io.UnsupportedEncodingException; import java.net.URI; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -38,11 +33,7 @@ import javax.ws.rs.core.UriInfo; import org.jboss.resteasy.plugins.providers.atom.Link; import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.base.BadRequestException; -import com.netscape.certsrv.base.IConfigStore; import com.netscape.certsrv.base.PKIException; -import com.netscape.certsrv.base.ResourceNotFoundException; -import com.netscape.certsrv.tps.config.ConfigCollection; import com.netscape.certsrv.tps.config.ConfigData; import com.netscape.certsrv.tps.config.ConfigResource; import com.netscape.cms.servlet.base.PKIService; @@ -70,107 +61,28 @@ public class ConfigService extends PKIService implements ConfigResource { CMS.debug("ConfigService.<init>()"); } - public Collection<String> getPatterns(String configID, Map<String, String> map) { - Collection<String> patterns = new ArrayList<String>(); - - String pattern = map.get("target." + configID + ".pattern"); - if (pattern != null) { - // replace \| with | - pattern = pattern.replace("\\|", "|"); - - String list = map.get("target." + configID + ".list"); - if (list == null) { - patterns.add(pattern); - - } else { - for (String value : list.split(",")) { - patterns.add(pattern.replace("$name", value)); - } - } - } - - return patterns; - } - - public ConfigData createConfigData(String configID, Map<String, String> map) throws UnsupportedEncodingException { - - String displayName = map.get("target." + configID + ".displayname"); - if (displayName == null) { - throw new ResourceNotFoundException("Configuration " + configID + " not found."); - } + public ConfigData createConfigData(Map<String, String> properties) throws UnsupportedEncodingException { ConfigData configData = new ConfigData(); - configData.setID(configID); - configData.setDisplayName(displayName); - - // add properties that fit the patterns - Collection<String> patterns = getPatterns(configID, map); - for (String pattern : patterns) { - for (String name : map.keySet()) { - if (!name.matches(pattern)) continue; - - String value = map.get(name); - configData.setProperty(name, value); - } - } + configData.setProperties(properties); - configID = URLEncoder.encode(configID, "UTF-8"); - URI uri = uriInfo.getBaseUriBuilder().path(ConfigResource.class).path("{configID}").build(configID); + URI uri = uriInfo.getBaseUriBuilder().path(ConfigResource.class).build(); configData.setLink(new Link("self", uri)); return configData; } @Override - public ConfigCollection findConfigs() { - - CMS.debug("ConfigService.findConfigs()"); - - try { - IConfigStore configStore = CMS.getConfigStore(); - Map<String, String> map = configStore.getProperties(); - - ConfigCollection result = new ConfigCollection(); - - Collection<String> configIDs = new LinkedHashSet<String>(); - configIDs.add("Generals"); - - String list = map.get("target.configure.list"); - if (list != null) { - configIDs.addAll(Arrays.asList(list.split(","))); - } - - list = map.get("target.agent_approve.list"); - if (list != null) { - configIDs.addAll(Arrays.asList(list.split(","))); - } - - for (String configID : configIDs) { - ConfigData configData = createConfigData(configID, map); - result.addConfig(configData); - } - - return result; - - } catch (PKIException e) { - throw e; - - } catch (Exception e) { - e.printStackTrace(); - throw new PKIException(e.getMessage()); - } - } - - @Override - public ConfigData getConfig(String configID) { + public ConfigData getConfig() { CMS.debug("ConfigService.getConfig()"); try { - IConfigStore configStore = CMS.getConfigStore(); - Map<String, String> map = configStore.getProperties(); + ConfigDatabase configDatabase = new ConfigDatabase(); + ConfigRecord configRecord = configDatabase.getRecord("Generals"); - return createConfigData(configID, map); + Map<String, String> properties = configDatabase.getProperties(configRecord, null); + return createConfigData(properties); } catch (PKIException e) { throw e; @@ -182,41 +94,31 @@ public class ConfigService extends PKIService implements ConfigResource { } @Override - public Response updateConfig(String configID, ConfigData newConfigData) { + public Response updateConfig(ConfigData configData) { CMS.debug("ConfigService.updateConfig()"); try { - IConfigStore configStore = CMS.getConfigStore(); - Map<String, String> map = configStore.getProperties(); - - // verify that new properties fit the patterns - Collection<String> patterns = getPatterns(configID, map); - for (String pattern : patterns) { - for (String name : newConfigData.getPropertyNames()) { - if (name.matches(pattern)) continue; - throw new BadRequestException("Invalid property: " + name); - } - } + ConfigDatabase configDatabase = new ConfigDatabase(); + ConfigRecord configRecord = configDatabase.getRecord("Generals"); + + // validate new properties + Map<String, String> properties = configData.getProperties(); + configDatabase.validateProperties(configRecord, null, properties); // remove old properties - ConfigData configData = createConfigData(configID, map); - for (String name : configData.getPropertyNames()) { - configStore.remove(name); - } + configDatabase.removeProperties(configRecord, null); - // store new properties - for (String name : newConfigData.getPropertyNames()) { - String value = newConfigData.getProperty(name); - configStore.put(name, value); - } + // add new properties + configDatabase.addProperties(configRecord, null, properties); - configStore.commit(true); + configDatabase.commit(); - newConfigData = getConfig(configID); + properties = configDatabase.getProperties(configRecord, null); + configData = createConfigData(properties); return Response - .ok(newConfigData) + .ok(configData) .type(MediaType.APPLICATION_XML) .build(); |
