From 12f44ba89a56eb56a8af2a11026291c208166f18 Mon Sep 17 00:00:00 2001
From: "Endi S. Dewata" <edewata@redhat.com>
Date: Tue, 24 Sep 2013 10:10:02 -0400
Subject: [PATCH] Added TPS authenticator service implementation.

The implementation of the TPS authenticator service has been modified to
use the configuration database to read and write the configuration file.

Ticket #652
---
 .../tps/authenticator/AuthenticatorClient.java     |   6 -
 .../tps/authenticator/AuthenticatorCollection.java |   4 +-
 .../tps/authenticator/AuthenticatorData.java       |  89 +++++++++--
 .../tps/authenticator/AuthenticatorInfo.java       | 152 ------------------
 .../authenticator/AuthenticatorModification.java   | 169 ---------------------
 .../tps/authenticator/AuthenticatorResource.java   |   9 --
 .../tps/authenticator/AuthenticatorAddCLI.java     |  41 ++---
 .../tps/authenticator/AuthenticatorCLI.java        |  53 ++-----
 .../tps/authenticator/AuthenticatorFindCLI.java    |  14 +-
 .../tps/authenticator/AuthenticatorModifyCLI.java  |  30 ++--
 .../tps/authenticator/AuthenticatorShowCLI.java    |  20 +--
 .../tps/authenticator/AuthenticatorDatabase.java   | 111 +++++++++++---
 .../tps/authenticator/AuthenticatorRecord.java     |  43 ++++--
 .../tps/authenticator/AuthenticatorService.java    |  78 +---------
 14 files changed, 262 insertions(+), 557 deletions(-)
 delete mode 100644 base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorInfo.java
 delete mode 100644 base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorModification.java

diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorClient.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorClient.java
index 82a76cc16e639787e76d5f8f2af1a009636f56ea..8f4d4fe2b427c9298e5fce555122f4f50ea99fb8 100644
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorClient.java
+++ b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorClient.java
@@ -64,12 +64,6 @@ public class AuthenticatorClient extends Client {
         return client.getEntity(response);
     }
 
-    public AuthenticatorData modifyAuthenticator(String authenticatorID, AuthenticatorModification authenticatorModification) {
-        @SuppressWarnings("unchecked")
-        ClientResponse<AuthenticatorData> response = (ClientResponse<AuthenticatorData>)resource.modifyAuthenticator(authenticatorID, authenticatorModification);
-        return client.getEntity(response);
-    }
-
     public void removeAuthenticator(String authenticatorID) {
         resource.removeAuthenticator(authenticatorID);
     }
diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorCollection.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorCollection.java
index e1978c8d39d238ac628ba98e8b7a8f501a5d0f18..ea922360315908ac126d23c3cb8c8b0064c09859 100644
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorCollection.java
+++ b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorCollection.java
@@ -29,10 +29,10 @@ import com.netscape.certsrv.base.DataCollection;
  * @author Endi S. Dewata
  */
 @XmlRootElement(name="Authenticators")
-public class AuthenticatorCollection extends DataCollection<AuthenticatorInfo> {
+public class AuthenticatorCollection extends DataCollection<AuthenticatorData> {
 
     @XmlElementRef
-    public Collection<AuthenticatorInfo> getEntries() {
+    public Collection<AuthenticatorData> getEntries() {
         return super.getEntries();
     }
 }
diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorData.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorData.java
index 609d241325cb13c90767c81afe5a68603d1da041..95fb5fefb67c70bf29dbd4b6d771e82facf6c11e 100644
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorData.java
+++ b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorData.java
@@ -20,6 +20,11 @@ package com.netscape.certsrv.tps.authenticator;
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
@@ -27,6 +32,9 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlValue;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.jboss.resteasy.plugins.providers.atom.Link;
 
@@ -51,7 +59,7 @@ public class AuthenticatorData {
 
     String id;
     String status;
-    String contents;
+    Map<String, String> properties = new LinkedHashMap<String, String>();
 
     Link link;
 
@@ -73,13 +81,67 @@ public class AuthenticatorData {
         this.status = status;
     }
 
-    @XmlElement(name="Contents")
-    public String getContents() {
-        return contents;
+    @XmlElement(name="Properties")
+    @XmlJavaTypeAdapter(MapAdapter.class)
+    public Map<String, String> getProperties() {
+        return properties;
     }
 
-    public void setContents(String contents) {
-        this.contents = contents;
+    public void setProperties(Map<String, String> properties) {
+        this.properties.clear();
+        this.properties.putAll(properties);
+    }
+
+    public Collection<String> getPropertyNames() {
+        return properties.keySet();
+    }
+
+    public String getProperty(String name) {
+        return properties.get(name);
+    }
+
+    public void setProperty(String name, String value) {
+        properties.put(name, value);
+    }
+
+    public String removeProperty(String name) {
+        return properties.remove(name);
+    }
+
+    public static class MapAdapter extends XmlAdapter<PropertyList, Map<String, String>> {
+
+        public PropertyList marshal(Map<String, String> map) {
+            PropertyList list = new PropertyList();
+            for (Map.Entry<String, String> entry : map.entrySet()) {
+                Property property = new Property();
+                property.name = entry.getKey();
+                property.value = entry.getValue();
+                list.properties.add(property);
+            }
+            return list;
+        }
+
+        public Map<String, String> unmarshal(PropertyList list) {
+            Map<String, String> map = new LinkedHashMap<String, String>();
+            for (Property property : list.properties) {
+                map.put(property.name, property.value);
+            }
+            return map;
+        }
+    }
+
+    public static class PropertyList {
+        @XmlElement(name="Property")
+        public List<Property> properties = new ArrayList<Property>();
+    }
+
+    public static class Property {
+
+        @XmlAttribute
+        public String name;
+
+        @XmlValue
+        public String value;
     }
 
     @XmlElement(name="Link")
@@ -95,9 +157,9 @@ public class AuthenticatorData {
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((contents == null) ? 0 : contents.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;
     }
@@ -111,11 +173,6 @@ public class AuthenticatorData {
         if (getClass() != obj.getClass())
             return false;
         AuthenticatorData other = (AuthenticatorData) obj;
-        if (contents == null) {
-            if (other.contents != null)
-                return false;
-        } else if (!contents.equals(other.contents))
-            return false;
         if (id == null) {
             if (other.id != null)
                 return false;
@@ -126,6 +183,11 @@ public class AuthenticatorData {
                 return false;
         } else if (!link.equals(other.link))
             return false;
+        if (properties == null) {
+            if (other.properties != null)
+                return false;
+        } else if (!properties.equals(other.properties))
+            return false;
         if (status == null) {
             if (other.status != null)
                 return false;
@@ -158,7 +220,8 @@ public class AuthenticatorData {
         AuthenticatorData before = new AuthenticatorData();
         before.setID("authenticator1");
         before.setStatus("ENABLED");
-        before.setContents("name=authenticator1\nparam=value");
+        before.setProperty("param1", "value1");
+        before.setProperty("param2", "value2");
 
         String string = before.toString();
         System.out.println(string);
diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorInfo.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorInfo.java
deleted file mode 100644
index 55ce9b4f38fc5160d2a88ae0ef6fabf53a49cdef..0000000000000000000000000000000000000000
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorInfo.java
+++ /dev/null
@@ -1,152 +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.certsrv.tps.authenticator;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.jboss.resteasy.plugins.providers.atom.Link;
-
-/**
- * @author Endi S. Dewata
- */
-@XmlRootElement(name="Authenticator")
-public class AuthenticatorInfo {
-
-    public static Marshaller marshaller;
-    public static Unmarshaller unmarshaller;
-
-    static {
-        try {
-            marshaller = JAXBContext.newInstance(AuthenticatorInfo.class).createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            unmarshaller = JAXBContext.newInstance(AuthenticatorInfo.class).createUnmarshaller();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    String id;
-    String status;
-
-    Link link;
-
-    @XmlAttribute(name="id")
-    public String getID() {
-        return id;
-    }
-
-    public void setID(String id) {
-        this.id = id;
-    }
-
-    @XmlElement(name="Status")
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    @XmlElement(name="Link")
-    public Link getLink() {
-        return link;
-    }
-
-    public void setLink(Link link) {
-        this.link = link;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((id == null) ? 0 : id.hashCode());
-        result = prime * result + ((link == null) ? 0 : link.hashCode());
-        result = prime * result + ((status == null) ? 0 : status.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;
-        AuthenticatorInfo other = (AuthenticatorInfo) obj;
-        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;
-        } else if (!link.equals(other.link))
-            return false;
-        if (status == null) {
-            if (other.status != null)
-                return false;
-        } else if (!status.equals(other.status))
-            return false;
-        return true;
-    }
-
-    public String toString() {
-        try {
-            StringWriter sw = new StringWriter();
-            marshaller.marshal(this, sw);
-            return sw.toString();
-
-        } catch (Exception e) {
-            return super.toString();
-        }
-    }
-
-    public static AuthenticatorInfo valueOf(String string) throws Exception {
-        try {
-            return (AuthenticatorInfo)unmarshaller.unmarshal(new StringReader(string));
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    public static void main(String args[]) throws Exception {
-
-        AuthenticatorInfo before = new AuthenticatorInfo();
-        before.setID("authenticator1");
-        before.setStatus("ENABLED");
-
-        String string = before.toString();
-        System.out.println(string);
-
-        AuthenticatorInfo after = AuthenticatorInfo.valueOf(string);
-        System.out.println(before.equals(after));
-    }
-}
diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorModification.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorModification.java
deleted file mode 100644
index fb78415e369fcc86c7ed32df09fa8967653c591f..0000000000000000000000000000000000000000
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorModification.java
+++ /dev/null
@@ -1,169 +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.certsrv.tps.authenticator;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.jboss.resteasy.plugins.providers.atom.Link;
-
-/**
- * @author Endi S. Dewata
- */
-@XmlRootElement(name="AuthenticatorModifyRequest")
-public class AuthenticatorModification {
-
-    public static Marshaller marshaller;
-    public static Unmarshaller unmarshaller;
-
-    static {
-        try {
-            marshaller = JAXBContext.newInstance(AuthenticatorModification.class).createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            unmarshaller = JAXBContext.newInstance(AuthenticatorModification.class).createUnmarshaller();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    String id;
-    String status;
-    String contents;
-
-    Link link;
-
-    @XmlAttribute(name="id")
-    public String getID() {
-        return id;
-    }
-
-    public void setID(String id) {
-        this.id = id;
-    }
-
-    @XmlElement(name="Status")
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    @XmlElement(name="Contents")
-    public String getContents() {
-        return contents;
-    }
-
-    public void setContents(String contents) {
-        this.contents = contents;
-    }
-
-    @XmlElement(name="Link")
-    public Link getLink() {
-        return link;
-    }
-
-    public void setLink(Link link) {
-        this.link = link;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((contents == null) ? 0 : contents.hashCode());
-        result = prime * result + ((id == null) ? 0 : id.hashCode());
-        result = prime * result + ((link == null) ? 0 : link.hashCode());
-        result = prime * result + ((status == null) ? 0 : status.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;
-        AuthenticatorModification other = (AuthenticatorModification) obj;
-        if (contents == null) {
-            if (other.contents != null)
-                return false;
-        } else if (!contents.equals(other.contents))
-            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;
-        } else if (!link.equals(other.link))
-            return false;
-        if (status == null) {
-            if (other.status != null)
-                return false;
-        } else if (!status.equals(other.status))
-            return false;
-        return true;
-    }
-
-    public String toString() {
-        try {
-            StringWriter sw = new StringWriter();
-            marshaller.marshal(this, sw);
-            return sw.toString();
-
-        } catch (Exception e) {
-            return super.toString();
-        }
-    }
-
-    public static AuthenticatorModification valueOf(String string) throws Exception {
-        try {
-            return (AuthenticatorModification)unmarshaller.unmarshal(new StringReader(string));
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    public static void main(String args[]) throws Exception {
-
-        AuthenticatorModification before = new AuthenticatorModification();
-        before.setID("authenticator1");
-        before.setStatus("ENABLED");
-        before.setContents("name=authenticator1\nparam=value");
-
-        String string = before.toString();
-        System.out.println(string);
-
-        AuthenticatorModification after = AuthenticatorModification.valueOf(string);
-        System.out.println(before.equals(after));
-    }
-}
diff --git a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorResource.java b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorResource.java
index 3a99a01d129e45fb73cd42df26ab3dd385ed37a6..8e9f7284a4e0d3d9b2f589eaa2440343a5707912 100644
--- a/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorResource.java
+++ b/base/common/src/com/netscape/certsrv/tps/authenticator/AuthenticatorResource.java
@@ -64,15 +64,6 @@ public interface AuthenticatorResource {
             @PathParam("authenticatorID") String authenticatorID,
             AuthenticatorData authenticatorData);
 
-    @POST
-    @Path("{authenticatorID}")
-    @ClientResponseType(entityType=AuthenticatorData.class)
-    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    public Response modifyAuthenticator(
-            @PathParam("authenticatorID") String authenticatorID,
-            AuthenticatorModification request);
-
     @DELETE
     @Path("{authenticatorID}")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorAddCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorAddCLI.java
index 836f8bd858cbc4d4d47b0bed14ef79d25005f85b..59ec2f7852862ed34277b7cd0c0e01f26fde47da 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorAddCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorAddCLI.java
@@ -43,17 +43,12 @@ public class AuthenticatorAddCLI extends CLI {
     }
 
     public void printHelp() {
-        formatter.printHelp(getFullName() + " <Authenticator ID> [OPTIONS...]", options);
+        formatter.printHelp(getFullName() + " [OPTIONS...]", options);
     }
 
     public void execute(String[] args) throws Exception {
 
-        Option option = new Option(null, "status", true, "Status: ENABLED, DISABLED.");
-        option.setArgName("status");
-        option.setRequired(true);
-        options.addOption(option);
-
-        option = new Option(null, "contents", true, "Input file containing authenticator attributes.");
+        Option option = new Option(null, "input", true, "Input file containing authenticator properties.");
         option.setArgName("file");
         option.setRequired(true);
         options.addOption(option);
@@ -71,37 +66,31 @@ public class AuthenticatorAddCLI extends CLI {
 
         String[] cmdArgs = cmd.getArgs();
 
-        if (cmdArgs.length != 1) {
+        if (cmdArgs.length != 0) {
             printHelp();
             System.exit(1);
         }
 
-        String authenticatorID = cmdArgs[0];
-        String status = cmd.getOptionValue("status");
-        String contents = cmd.getOptionValue("contents");
+        String input = cmd.getOptionValue("input");
 
-        AuthenticatorData authenticatorData = new AuthenticatorData();
-        authenticatorData.setID(authenticatorID);
-        authenticatorData.setStatus(status);
+        AuthenticatorData authenticatorData;
 
-        if (contents != null) {
-            try (BufferedReader in = new BufferedReader(new FileReader(contents));
-                StringWriter sw = new StringWriter();
-                PrintWriter out = new PrintWriter(sw, true)) {
+        try (BufferedReader in = new BufferedReader(new FileReader(input));
+            StringWriter sw = new StringWriter();
+            PrintWriter out = new PrintWriter(sw, true)) {
 
-                String line;
-                while ((line = in.readLine()) != null) {
-                    out.println(line);
-                }
-
-                authenticatorData.setContents(sw.toString());
+            String line;
+            while ((line = in.readLine()) != null) {
+                out.println(line);
             }
+
+            authenticatorData = AuthenticatorData.valueOf(sw.toString());
         }
 
         authenticatorData = authenticatorCLI.authenticatorClient.addAuthenticator(authenticatorData);
 
-        MainCLI.printMessage("Added authenticator \"" + authenticatorID + "\"");
+        MainCLI.printMessage("Added authenticator \"" + authenticatorData.getID() + "\"");
 
-        AuthenticatorCLI.printAuthenticatorData(authenticatorData);
+        AuthenticatorCLI.printAuthenticatorData(authenticatorData, true);
     }
 }
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorCLI.java
index 198982a0623ca1ed3fa9eb0b34cc556a3458f91c..ebdf808900230b55b87908e31e017449df41a52d 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorCLI.java
@@ -18,16 +18,13 @@
 
 package com.netscape.cmstools.tps.authenticator;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.StringReader;
-import java.util.Arrays;
+import java.util.Map;
 
 import org.jboss.resteasy.plugins.providers.atom.Link;
 
 import com.netscape.certsrv.tps.authenticator.AuthenticatorClient;
 import com.netscape.certsrv.tps.authenticator.AuthenticatorData;
-import com.netscape.certsrv.tps.authenticator.AuthenticatorInfo;
 import com.netscape.cmstools.cli.CLI;
 
 /**
@@ -52,51 +49,19 @@ public class AuthenticatorCLI extends CLI {
         client = parent.getClient();
         authenticatorClient = (AuthenticatorClient)parent.getClient("authenticator");
 
-        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);
-        }
-    }
-
-    public static void printAuthenticatorInfo(AuthenticatorInfo authenticatorInfo) {
-        System.out.println("  Authenticator ID: " + authenticatorInfo.getID());
-        if (authenticatorInfo.getStatus() != null) System.out.println("  Status: " + authenticatorInfo.getStatus());
-
-        Link link = authenticatorInfo.getLink();
-        if (verbose && link != null) {
-            System.out.println("  Link: " + link.getHref());
-        }
+        super.execute(args);
     }
 
-    public static void printAuthenticatorData(AuthenticatorData authenticatorData) throws IOException {
+    public static void printAuthenticatorData(AuthenticatorData authenticatorData, boolean showProperties) throws IOException {
         System.out.println("  Authenticator ID: " + authenticatorData.getID());
         if (authenticatorData.getStatus() != null) System.out.println("  Status: " + authenticatorData.getStatus());
 
-        System.out.println("  Contents:");
-        String contents = authenticatorData.getContents();
-        if (contents != null) {
-            BufferedReader in = new BufferedReader(new StringReader(contents));
-            String line;
-            while ((line = in.readLine()) != null) {
-                System.out.println("    " + line);
+        if (showProperties) {
+            System.out.println("  Properties:");
+            Map<String, String> properties = authenticatorData.getProperties();
+            for (String name : properties.keySet()) {
+                String value = properties.get(name);
+                System.out.println("    " + name + ": " + value);
             }
         }
 
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorFindCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorFindCLI.java
index 34c291fd1247a49688750594751ecff8aafd57ca..2ff8288a012b56ecc544970d640dcce034aab0e8 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorFindCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorFindCLI.java
@@ -24,7 +24,7 @@ import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 
 import com.netscape.certsrv.tps.authenticator.AuthenticatorCollection;
-import com.netscape.certsrv.tps.authenticator.AuthenticatorInfo;
+import com.netscape.certsrv.tps.authenticator.AuthenticatorData;
 import com.netscape.cmstools.cli.CLI;
 import com.netscape.cmstools.cli.MainCLI;
 
@@ -35,9 +35,9 @@ public class AuthenticatorFindCLI extends CLI {
 
     public AuthenticatorCLI authenticatorCLI;
 
-    public AuthenticatorFindCLI(AuthenticatorCLI tokenCLI) {
-        super("find", "Find authenticators", tokenCLI);
-        this.authenticatorCLI = tokenCLI;
+    public AuthenticatorFindCLI(AuthenticatorCLI authenticatorCLI) {
+        super("find", "Find authenticators", authenticatorCLI);
+        this.authenticatorCLI = authenticatorCLI;
     }
 
     public void printHelp() {
@@ -72,13 +72,13 @@ public class AuthenticatorFindCLI extends CLI {
         Integer size = s == null ? null : Integer.valueOf(s);
 
         AuthenticatorCollection result = authenticatorCLI.authenticatorClient.findAuthenticators(start, size);
-        Collection<AuthenticatorInfo> authenticators = result.getEntries();
+        Collection<AuthenticatorData> authenticators = result.getEntries();
 
         MainCLI.printMessage(authenticators.size() + " authenticator(s) matched");
 
         boolean first = true;
 
-        for (AuthenticatorInfo authenticatorInfo : authenticators) {
+        for (AuthenticatorData authenticatorData : authenticators) {
 
             if (first) {
                 first = false;
@@ -86,7 +86,7 @@ public class AuthenticatorFindCLI extends CLI {
                 System.out.println();
             }
 
-            AuthenticatorCLI.printAuthenticatorInfo(authenticatorInfo);
+            AuthenticatorCLI.printAuthenticatorData(authenticatorData, false);
         }
 
         MainCLI.printMessage("Number of entries returned " + authenticators.size());
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorModifyCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorModifyCLI.java
index c5fc01e07b1e3057dbf575be867884f9b395eecc..292e03f7551facf8a99d4daad979b0514e0c8947 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorModifyCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorModifyCLI.java
@@ -27,7 +27,6 @@ import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 
 import com.netscape.certsrv.tps.authenticator.AuthenticatorData;
-import com.netscape.certsrv.tps.authenticator.AuthenticatorModification;
 import com.netscape.cmstools.cli.CLI;
 import com.netscape.cmstools.cli.MainCLI;
 
@@ -53,7 +52,7 @@ public class AuthenticatorModifyCLI extends CLI {
         option.setArgName("status");
         options.addOption(option);
 
-        option = new Option(null, "contents", true, "Input file containing authenticator attributes.");
+        option = new Option(null, "input", true, "Input file containing authenticator properties.");
         option.setArgName("file");
         options.addOption(option);
 
@@ -77,31 +76,26 @@ public class AuthenticatorModifyCLI extends CLI {
 
         String authenticatorID = cmdArgs[0];
         String status = cmd.getOptionValue("status");
-        String contents = cmd.getOptionValue("contents");
+        String input = cmd.getOptionValue("input");
 
-        AuthenticatorModification authenticatorModification = new AuthenticatorModification();
-        authenticatorModification.setID(authenticatorID);
-        authenticatorModification.setStatus(status);
+        AuthenticatorData authenticatorData;
 
-        if (contents != null) {
-            // load contents from file
+        try (BufferedReader in = new BufferedReader(new FileReader(input));
             StringWriter sw = new StringWriter();
-            try (BufferedReader in = new BufferedReader(new FileReader(contents));
-                PrintWriter out = new PrintWriter(sw, true)) {
+            PrintWriter out = new PrintWriter(sw, true)) {
 
-                String line;
-                while ((line = in.readLine()) != null) {
-                    out.println(line);
-                }
-
-                authenticatorModification.setContents(sw.toString());
+            String line;
+            while ((line = in.readLine()) != null) {
+                out.println(line);
             }
+
+            authenticatorData = AuthenticatorData.valueOf(sw.toString());
         }
 
-        AuthenticatorData authenticatorData = authenticatorCLI.authenticatorClient.modifyAuthenticator(authenticatorID, authenticatorModification);
+        authenticatorData = authenticatorCLI.authenticatorClient.updateAuthenticator(authenticatorID, authenticatorData);
 
         MainCLI.printMessage("Modified authenticator \"" + authenticatorID + "\"");
 
-        AuthenticatorCLI.printAuthenticatorData(authenticatorData);
+        AuthenticatorCLI.printAuthenticatorData(authenticatorData, true);
     }
 }
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorShowCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorShowCLI.java
index d4549aa0fada578f1b87c8536ba0cfcd3a90297c..af1290aa02519f5ae7d4cf956cb851e517ee0381 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorShowCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/authenticator/AuthenticatorShowCLI.java
@@ -46,7 +46,7 @@ public class AuthenticatorShowCLI extends CLI {
 
     public void execute(String[] args) throws Exception {
 
-        Option option = new Option(null, "contents", true, "Output file to store authenticator attributes.");
+        Option option = new Option(null, "output", true, "Output file to store authenticator properties.");
         option.setArgName("file");
         options.addOption(option);
 
@@ -69,19 +69,19 @@ public class AuthenticatorShowCLI extends CLI {
         }
 
         String authenticatorID = args[0];
-        String file = cmd.getOptionValue("contents");
+        String output = cmd.getOptionValue("output");
 
         AuthenticatorData authenticatorData = authenticatorCLI.authenticatorClient.getAuthenticator(authenticatorID);
 
-        MainCLI.printMessage("Authenticator \"" + authenticatorID + "\"");
-        AuthenticatorCLI.printAuthenticatorData(authenticatorData);
+        if (output == null) {
+            MainCLI.printMessage("Authenticator \"" + authenticatorID + "\"");
+            AuthenticatorCLI.printAuthenticatorData(authenticatorData, true);
 
-        if (file != null) {
-            // store contents to file
-            PrintWriter out = new PrintWriter(new FileWriter(file));
-            String contents = authenticatorData.getContents();
-            if (contents != null) out.print(contents);
-            out.close();
+        } else {
+            try (PrintWriter out = new PrintWriter(new FileWriter(output))) {
+                out.println(authenticatorData);
+            }
+            MainCLI.printMessage("Stored authenticator \"" + authenticatorID + "\" into " + output);
         }
     }
 }
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorDatabase.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorDatabase.java
index 42fe9aae4ee382a34baf7c933cb852dda4d218e0..f7347a497006c44e46ac91d1ecf74ef62276e91a 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorDatabase.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorDatabase.java
@@ -18,11 +18,18 @@
 
 package org.dogtagpki.server.tps.authenticator;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
+import org.dogtagpki.server.tps.config.ConfigDatabase;
+import org.dogtagpki.server.tps.config.ConfigRecord;
+
+import com.netscape.certsrv.apps.CMS;
 import com.netscape.cmscore.dbs.Database;
 
 /**
- * This class implements in-memory connection database. In the future this
- * will be replaced with LDAP database.
+ * This class provides access to the authenticators in CS.cfg.
  *
  * @author Endi S. Dewata
  */
@@ -30,31 +37,95 @@ public class AuthenticatorDatabase extends Database<AuthenticatorRecord> {
 
     public AuthenticatorDatabase() {
         super("Authenticator");
+    }
 
-        // add sample records
-        try {
-            AuthenticatorRecord record1 = new AuthenticatorRecord();
-            record1.setID("authenticator1");
-            record1.setStatus("ENABLED");
-            record1.setContents("name=authenticator1\nparam=value");
-            addRecord(record1);
+    public AuthenticatorRecord createAuthenticatorRecord(ConfigDatabase configDatabase, ConfigRecord configRecord, String authenticatorID) {
+        AuthenticatorRecord authenticatorRecord = new AuthenticatorRecord();
+        authenticatorRecord.setID(authenticatorID);
+        Map<String, String> properties = configDatabase.getProperties(configRecord, authenticatorID);
+        authenticatorRecord.setProperties(properties);
+        return authenticatorRecord;
+    }
 
-            AuthenticatorRecord record2 = new AuthenticatorRecord();
-            record2.setID("authenticator2");
-            record2.setStatus("DISABLED");
-            record2.setContents("name=authenticator2\nparam=value");
-            addRecord(record2);
+    @Override
+    public Collection<AuthenticatorRecord> getRecords() throws Exception {
 
-        } catch (Exception e) {
-            e.printStackTrace();
+        Collection<AuthenticatorRecord> result = new ArrayList<AuthenticatorRecord>();
+        ConfigDatabase configDatabase = new ConfigDatabase();
+        ConfigRecord configRecord = configDatabase.getRecord("Authentication_Sources");
+
+        for (String authenticatorID : configRecord.getKeys()) {
+            AuthenticatorRecord authenticatorRecord = createAuthenticatorRecord(configDatabase, configRecord, authenticatorID);
+            result.add(authenticatorRecord);
         }
+
+        return result;
     }
 
-    public void addRecord(AuthenticatorRecord authenticatorRecord) throws Exception {
-        addRecord(authenticatorRecord.getID(), authenticatorRecord);
+    @Override
+    public AuthenticatorRecord getRecord(String authenticatorID) throws Exception {
+
+        ConfigDatabase configDatabase = new ConfigDatabase();
+        ConfigRecord configRecord = configDatabase.getRecord("Authentication_Sources");
+
+        return createAuthenticatorRecord(configDatabase, configRecord, authenticatorID);
     }
 
-    public void updateRecord(AuthenticatorRecord authenticatorRecord) throws Exception {
-        updateRecord(authenticatorRecord.getID(), authenticatorRecord);
+    @Override
+    public void addRecord(String authenticatorID, AuthenticatorRecord authenticatorRecord) throws Exception {
+
+        CMS.debug("AuthenticatorDatabase.addRecord(\"" + authenticatorID + "\")");
+        ConfigDatabase configDatabase = new ConfigDatabase();
+        ConfigRecord configRecord = configDatabase.getRecord("Authentication_Sources");
+
+        // validate new properties
+        Map<String, String> properties = authenticatorRecord.getProperties();
+        configDatabase.validateProperties(configRecord, authenticatorID, properties);
+
+        // add new connection
+        configRecord.addKey(authenticatorID);
+        configDatabase.updateRecord("Authentication_Sources", configRecord);
+
+        // store new properties
+        configDatabase.addProperties(configRecord, authenticatorID, properties);
+
+        configDatabase.commit();
+    }
+
+    @Override
+    public void updateRecord(String authenticatorID, AuthenticatorRecord authenticatorRecord) throws Exception {
+
+        CMS.debug("AuthenticatorDatabase.updateRecord(\"" + authenticatorID + "\")");
+        ConfigDatabase configDatabase = new ConfigDatabase();
+        ConfigRecord configRecord = configDatabase.getRecord("Authentication_Sources");
+
+        // validate new properties
+        Map<String, String> properties = authenticatorRecord.getProperties();
+        configDatabase.validateProperties(configRecord, authenticatorID, properties);
+
+        // remove old properties
+        configDatabase.removeProperties(configRecord, authenticatorID);
+
+        // add new properties
+        configDatabase.addProperties(configRecord, authenticatorID, properties);
+
+        configDatabase.commit();
+    }
+
+    @Override
+    public void removeRecord(String authenticatorID) throws Exception {
+
+        CMS.debug("AuthenticatorDatabase.removeRecord(\"" + authenticatorID + "\")");
+        ConfigDatabase configDatabase = new ConfigDatabase();
+        ConfigRecord configRecord = configDatabase.getRecord("Authentication_Sources");
+
+        // remove properties
+        configDatabase.removeProperties(configRecord, authenticatorID);
+
+        // remove connection
+        configRecord.removeKey(authenticatorID);
+        configDatabase.updateRecord("Authentication_Sources", configRecord);
+
+        configDatabase.commit();
     }
 }
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorRecord.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorRecord.java
index 46fa438763a2729255930dc20e2e223532f1927b..74591bb798bc1d790864d6e3c0f713e3473e8a48 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorRecord.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorRecord.java
@@ -18,6 +18,10 @@
 
 package org.dogtagpki.server.tps.authenticator;
 
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
 
 /**
  * @author Endi S. Dewata
@@ -26,7 +30,7 @@ public class AuthenticatorRecord {
 
     String id;
     String status;
-    String contents;
+    Map<String, String> properties = new TreeMap<String, String>();
 
     public String getID() {
         return id;
@@ -44,20 +48,37 @@ public class AuthenticatorRecord {
         this.status = status;
     }
 
-    public String getContents() {
-        return contents;
+    public Map<String, String> getProperties() {
+        return properties;
     }
 
-    public void setContents(String contents) {
-        this.contents = contents;
+    public void setProperties(Map<String, String> properties) {
+        this.properties.clear();
+        this.properties.putAll(properties);
+    }
+
+    public Collection<String> getPropertyNames() {
+        return properties.keySet();
+    }
+
+    public String getProperty(String name) {
+        return properties.get(name);
+    }
+
+    public void setProperty(String name, String value) {
+        properties.put(name, value);
+    }
+
+    public String removeProperty(String name) {
+        return properties.remove(name);
     }
 
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((contents == null) ? 0 : contents.hashCode());
         result = prime * result + ((id == null) ? 0 : id.hashCode());
+        result = prime * result + ((properties == null) ? 0 : properties.hashCode());
         result = prime * result + ((status == null) ? 0 : status.hashCode());
         return result;
     }
@@ -71,16 +92,16 @@ public class AuthenticatorRecord {
         if (getClass() != obj.getClass())
             return false;
         AuthenticatorRecord other = (AuthenticatorRecord) obj;
-        if (contents == null) {
-            if (other.contents != null)
-                return false;
-        } else if (!contents.equals(other.contents))
-            return false;
         if (id == null) {
             if (other.id != null)
                 return false;
         } else if (!id.equals(other.id))
             return false;
+        if (properties == null) {
+            if (other.properties != null)
+                return false;
+        } else if (!properties.equals(other.properties))
+            return false;
         if (status == null) {
             if (other.status != null)
                 return false;
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorService.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorService.java
index 058bf0f8b7897605de82f99732aae399048441c1..e1d7ed5cf80fb1e74df72c98bb18e38037ec2c64 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorService.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/authenticator/AuthenticatorService.java
@@ -38,8 +38,6 @@ import com.netscape.certsrv.apps.CMS;
 import com.netscape.certsrv.base.PKIException;
 import com.netscape.certsrv.tps.authenticator.AuthenticatorCollection;
 import com.netscape.certsrv.tps.authenticator.AuthenticatorData;
-import com.netscape.certsrv.tps.authenticator.AuthenticatorInfo;
-import com.netscape.certsrv.tps.authenticator.AuthenticatorModification;
 import com.netscape.certsrv.tps.authenticator.AuthenticatorResource;
 import com.netscape.cms.servlet.base.PKIService;
 
@@ -66,41 +64,16 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
         CMS.debug("AuthenticatorService.<init>()");
     }
 
-    public AuthenticatorInfo createAuthenticatorInfo(AuthenticatorRecord authenticatorRecord) {
-
-        AuthenticatorInfo authenticatorInfo = new AuthenticatorInfo();
-        authenticatorInfo.setID(authenticatorRecord.getID());
-        authenticatorInfo.setStatus(authenticatorRecord.getStatus());
+    public AuthenticatorData createAuthenticatorData(AuthenticatorRecord authenticatorRecord) throws UnsupportedEncodingException {
 
         String authenticatorID = authenticatorRecord.getID();
-        try {
-            authenticatorID = URLEncoder.encode(authenticatorID, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-            throw new PKIException(e.getMessage());
-        }
-
-        URI uri = uriInfo.getBaseUriBuilder().path(AuthenticatorResource.class).path("{authenticatorID}").build(authenticatorID);
-        authenticatorInfo.setLink(new Link("self", uri));
-
-        return authenticatorInfo;
-    }
-
-    public AuthenticatorData createAuthenticatorData(AuthenticatorRecord authenticatorRecord) {
 
         AuthenticatorData authenticatorData = new AuthenticatorData();
-        authenticatorData.setID(authenticatorRecord.getID());
+        authenticatorData.setID(authenticatorID);
         authenticatorData.setStatus(authenticatorRecord.getStatus());
-        authenticatorData.setContents(authenticatorRecord.getContents());
-
-        String authenticatorID = authenticatorRecord.getID();
-        try {
-            authenticatorID = URLEncoder.encode(authenticatorID, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-            throw new PKIException(e.getMessage());
-        }
+        authenticatorData.setProperties(authenticatorRecord.getProperties());
 
+        authenticatorID = URLEncoder.encode(authenticatorID, "UTF-8");
         URI uri = uriInfo.getBaseUriBuilder().path(AuthenticatorResource.class).path("{authenticatorID}").build(authenticatorID);
         authenticatorData.setLink(new Link("self", uri));
 
@@ -112,7 +85,7 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
         AuthenticatorRecord authenticatorRecord = new AuthenticatorRecord();
         authenticatorRecord.setID(authenticatorData.getID());
         authenticatorRecord.setStatus(authenticatorData.getStatus());
-        authenticatorRecord.setContents(authenticatorData.getContents());
+        authenticatorRecord.setProperties(authenticatorData.getProperties());
 
         return authenticatorRecord;
     }
@@ -140,7 +113,7 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
 
             // return entries up to the page size
             for ( ; i<start+size && authenticators.hasNext(); i++) {
-                response.addEntry(createAuthenticatorInfo(authenticators.next()));
+                response.addEntry(createAuthenticatorData(authenticators.next()));
             }
 
             // count the total entries
@@ -190,7 +163,7 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
             TPSSubsystem subsystem = (TPSSubsystem)CMS.getSubsystem(TPSSubsystem.ID);
             AuthenticatorDatabase database = subsystem.getAuthenticatorDatabase();
 
-            database.addRecord(createAuthenticatorRecord(authenticatorData));
+            database.addRecord(authenticatorData.getID(), createAuthenticatorRecord(authenticatorData));
             authenticatorData = createAuthenticatorData(database.getRecord(authenticatorData.getID()));
 
             return Response
@@ -214,7 +187,7 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
             TPSSubsystem subsystem = (TPSSubsystem)CMS.getSubsystem(TPSSubsystem.ID);
             AuthenticatorDatabase database = subsystem.getAuthenticatorDatabase();
 
-            database.updateRecord(createAuthenticatorRecord(authenticatorData));
+            database.updateRecord(authenticatorID, createAuthenticatorRecord(authenticatorData));
             authenticatorData = createAuthenticatorData(database.getRecord(authenticatorID));
 
             return Response
@@ -229,41 +202,6 @@ public class AuthenticatorService extends PKIService implements AuthenticatorRes
     }
 
     @Override
-    public Response modifyAuthenticator(String authenticatorID, AuthenticatorModification request) {
-
-        CMS.debug("AuthenticatorService.modifyAuthenticator(\"" + authenticatorID + "\", request");
-
-        try {
-            TPSSubsystem subsystem = (TPSSubsystem)CMS.getSubsystem(TPSSubsystem.ID);
-            AuthenticatorDatabase database = subsystem.getAuthenticatorDatabase();
-
-            AuthenticatorRecord authenticatorRecord = database.getRecord(authenticatorID);
-
-            String status = request.getStatus();
-            if (status != null) {
-                authenticatorRecord.setStatus(status);
-            }
-
-            String contents = request.getContents();
-            if (contents != null) {
-                authenticatorRecord.setContents(contents);
-            }
-
-            database.updateRecord(authenticatorRecord);
-            AuthenticatorData authenticatorData = createAuthenticatorData(database.getRecord(authenticatorID));
-
-            return Response
-                    .ok(authenticatorData)
-                    .type(MediaType.APPLICATION_XML)
-                    .build();
-
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new PKIException(e.getMessage());
-        }
-    }
-
-    @Override
     public void removeAuthenticator(String authenticatorID) {
 
         CMS.debug("AuthenticatorService.removeAuthenticator(\"" + authenticatorID + "\")");
-- 
1.8.1.4

