[Pki-devel] [PATCH] 573 Fixed status dropdown list in TPS UI.

Endi Sukma Dewata edewata at redhat.com
Mon Apr 20 13:43:02 UTC 2015


The status dropdown list in TPS UI has been fixed to show only the
valid transitions based on the tokendb.allowedTransitions in CS.cfg.

The 0:4 transition has been removed from tokendb.allowedTransitions
since it cannot be done via UI.

https://fedorahosted.org/pki/ticket/1275

-- 
Endi S. Dewata
-------------- next part --------------
From 4a2ea0789d3a3e65f1bccc7f3f10a58bf32a406c Mon Sep 17 00:00:00 2001
From: "Endi S. Dewata" <edewata at redhat.com>
Date: Mon, 20 Apr 2015 09:28:46 -0400
Subject: [PATCH] Fixed status dropdown list in TPS UI.

The status dropdown list in TPS UI has been fixed to show only the
valid transitions based on the tokendb.allowedTransitions in CS.cfg.

The 0:4 transition has been removed from tokendb.allowedTransitions
since it cannot be done via UI.

https://fedorahosted.org/pki/ticket/1275
---
 .../com/netscape/certsrv/tps/token/TokenData.java  | 55 ++++++++++++++++++++++
 .../com/netscape/cmstools/tps/token/TokenCLI.java  | 10 ++++
 base/tps/shared/conf/CS.cfg.in                     |  2 +-
 base/tps/shared/webapps/tps/js/token.js            | 33 +++++++++++++
 .../dogtagpki/server/tps/rest/TokenService.java    | 32 +++++++------
 5 files changed, 117 insertions(+), 15 deletions(-)

diff --git a/base/common/src/com/netscape/certsrv/tps/token/TokenData.java b/base/common/src/com/netscape/certsrv/tps/token/TokenData.java
index 235e86feaebeafec5d6263e3658a53791fb845de..345c743b8c65b4ca0919bc66b06605d69055f1e8 100644
--- a/base/common/src/com/netscape/certsrv/tps/token/TokenData.java
+++ b/base/common/src/com/netscape/certsrv/tps/token/TokenData.java
@@ -20,7 +20,10 @@ package com.netscape.certsrv.tps.token;
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Date;
+import java.util.TreeSet;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
@@ -28,6 +31,8 @@ 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.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.jboss.resteasy.plugins.providers.atom.Link;
 
@@ -55,6 +60,7 @@ public class TokenData {
     String userID;
     String type;
     TokenStatus status;
+    Collection<TokenStatus> nextStatuses = new TreeSet<TokenStatus>();
     String appletID;
     String keyInfo;
     String policy;
@@ -108,6 +114,18 @@ public class TokenData {
         this.status = status;
     }
 
+    @XmlElement(name="NextStatuses")
+    @XmlJavaTypeAdapter(TokenStatusesAdapter.class)
+    public Collection<TokenStatus> getNextStatuses() {
+        return nextStatuses;
+    }
+
+    public void setNextStatuses(Collection<TokenStatus> nextStatuses) {
+        this.nextStatuses.clear();
+        if (nextStatuses == null) return;
+        this.nextStatuses.addAll(nextStatuses);
+    }
+
     @XmlElement(name="AppletID")
     public String getAppletID() {
         return appletID;
@@ -172,6 +190,7 @@ public class TokenData {
         result = prime * result + ((keyInfo == null) ? 0 : keyInfo.hashCode());
         result = prime * result + ((link == null) ? 0 : link.hashCode());
         result = prime * result + ((modifyTimestamp == null) ? 0 : modifyTimestamp.hashCode());
+        result = prime * result + ((nextStatuses == null) ? 0 : nextStatuses.hashCode());
         result = prime * result + ((policy == null) ? 0 : policy.hashCode());
         result = prime * result + ((status == null) ? 0 : status.hashCode());
         result = prime * result + ((tokenID == null) ? 0 : tokenID.hashCode());
@@ -219,6 +238,11 @@ public class TokenData {
                 return false;
         } else if (!modifyTimestamp.equals(other.modifyTimestamp))
             return false;
+        if (nextStatuses == null) {
+            if (other.nextStatuses != null)
+                return false;
+        } else if (!nextStatuses.equals(other.nextStatuses))
+            return false;
         if (policy == null) {
             if (other.policy != null)
                 return false;
@@ -263,13 +287,44 @@ public class TokenData {
         }
     }
 
+    public static class TokenStatusesAdapter extends XmlAdapter<TokenStatusList, Collection<TokenStatus>> {
+
+        public TokenStatusList marshal(Collection<TokenStatus> statuses) {
+            TokenStatusList list = new TokenStatusList();
+            list.statuses = statuses.toArray(new TokenStatus[statuses.size()]);
+            return list;
+        }
+
+        public Collection<TokenStatus> unmarshal(TokenStatusList list) {
+            Collection<TokenStatus> statuses = new TreeSet<TokenStatus>();
+            if (list.statuses != null) {
+                statuses.addAll(Arrays.asList(list.statuses));
+            }
+            return statuses;
+        }
+    }
+
+    public static class TokenStatusList {
+
+        @XmlElement(name="Status")
+        public TokenStatus[] statuses;
+    }
+
     public static void main(String args[]) throws Exception {
 
         TokenData before = new TokenData();
         before.setID("token1");
         before.setUserID("user1");
         before.setType("userKey");
+
         before.setStatus(TokenStatus.ACTIVE);
+
+        Collection<TokenStatus> nextStatuses = before.getNextStatuses();
+        nextStatuses.add(TokenStatus.DAMAGED);
+        nextStatuses.add(TokenStatus.PERM_LOST);
+        nextStatuses.add(TokenStatus.TEMP_LOST);
+        nextStatuses.add(TokenStatus.TERMINATED);
+
         before.setAppletID("APPLET1234");
         before.setKeyInfo("key info");
         before.setPolicy("FORCE_FORMAT=YES");
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/token/TokenCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/token/TokenCLI.java
index e7dd6a3081bdd89013d6d65d5b48797fb29dd55a..8c2db257f61c1524597f69f07b89dc147046e30c 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/token/TokenCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/token/TokenCLI.java
@@ -18,10 +18,14 @@
 
 package com.netscape.cmstools.tps.token;
 
+import java.util.Collection;
+
+import org.apache.commons.lang.StringUtils;
 import org.jboss.resteasy.plugins.providers.atom.Link;
 
 import com.netscape.certsrv.tps.token.TokenClient;
 import com.netscape.certsrv.tps.token.TokenData;
+import com.netscape.certsrv.tps.token.TokenStatus;
 import com.netscape.cmstools.cli.CLI;
 
 /**
@@ -54,6 +58,12 @@ public class TokenCLI extends CLI {
         if (token.getUserID() != null) System.out.println("  User ID: " + token.getUserID());
         if (token.getType() != null) System.out.println("  Type: " + token.getType());
         if (token.getStatus() != null) System.out.println("  Status: " + token.getStatus());
+
+        Collection<TokenStatus> nextStatuses = token.getNextStatuses();
+        if (nextStatuses != null) {
+            System.out.println("  Next Statuses: " + StringUtils.join(nextStatuses, ", "));
+        }
+
         if (token.getAppletID() != null) System.out.println("  Applet ID: " + token.getAppletID());
         if (token.getKeyInfo() != null) System.out.println("  Key Info: " + token.getKeyInfo());
         if (token.getPolicy() != null) System.out.println("  Policy: " + token.getPolicy());
diff --git a/base/tps/shared/conf/CS.cfg.in b/base/tps/shared/conf/CS.cfg.in
index e583ac097c8be3f716a0a88f047c13a1039b1f5f..aa3df060a3de583be7ba6881441e7f316212a9f5 100644
--- a/base/tps/shared/conf/CS.cfg.in
+++ b/base/tps/shared/conf/CS.cfg.in
@@ -1897,7 +1897,7 @@ tokendb.addConfigTemplate=addConfig.template
 tokendb.addResultTemplate=addResults.template
 tokendb.agentSelectConfigTemplate=agentSelectConfig.template
 tokendb.agentViewConfigTemplate=agentViewConfig.template
-tokendb.allowedTransitions=0:1,0:2,0:3,0:4,0:5,0:6,3:4,3:5,3:6,4:1,4:2,4:3,4:6
+tokendb.allowedTransitions=0:1,0:2,0:3,0:5,0:6,3:4,3:5,3:6,4:1,4:2,4:3,4:6
 tokendb.auditAdminTemplate=auditAdmin.template
 tokendb.auditLog=[PKI_INSTANCE_PATH]/logs/tokendb-audit.log
 tokendb.baseDN=ou=Tokens,[TOKENDB_ROOT]
diff --git a/base/tps/shared/webapps/tps/js/token.js b/base/tps/shared/webapps/tps/js/token.js
index f4d2d8a78e46b92fd1e0ae9a87136f0e63e3e2c8..ba82bddfa47997e468314d69f5ff18e4ebe6a2f1 100644
--- a/base/tps/shared/webapps/tps/js/token.js
+++ b/base/tps/shared/webapps/tps/js/token.js
@@ -24,6 +24,7 @@ var TokenStatus = {
     ACTIVE: "Active",
     TEMP_LOST: "Temporarily lost",
     PERM_LOST: "Permanently lost",
+    TEMP_LOST_PERM_LOST: "Permanently lost",
     DAMAGED: "Physically damaged",
     TERMINATED: "Terminated"
 };
@@ -38,6 +39,7 @@ var TokenModel = Model.extend({
             type: response.Type,
             status: response.Status,
             statusLabel: TokenStatus[response.Status],
+            nextStatuses: response.NextStatuses.Status,
             appletID: response.AppletID,
             keyInfo: response.KeyInfo,
             policy: response.Policy,
@@ -91,6 +93,7 @@ var TokenCollection = Collection.extend({
             type: entry.Type,
             status: entry.Status,
             statusLabel: TokenStatus[entry.Status],
+            nextStatuses: entry.NextStatuses.Status,
             appletID: entry.AppletID,
             keyInfo: entry.KeyInfo,
             policy: entry.Policy,
@@ -125,6 +128,21 @@ var TokenPage = EntryPage.extend({
 
             dialog.entry = _.clone(self.model.attributes);
 
+            var statusSelection = $("select[name='status']", dialog.$el);
+            statusSelection.empty();
+            
+            $("<option/>", {
+                value: dialog.entry.status,
+                text: TokenStatus[dialog.entry.status]
+            }).appendTo(statusSelection);
+
+            _.each(dialog.entry.nextStatuses, function(nextStatus) {
+                $("<option/>", {
+                    value: nextStatus,
+                    text: TokenStatus[nextStatus]
+                }).appendTo(statusSelection);
+            });
+
             dialog.handler("save", function() {
 
                 // save changes
@@ -209,6 +227,21 @@ var TokenTableItem = TableItem.extend({
 
         dialog.entry = _.clone(model.attributes);
 
+        var statusSelection = $("select[name='status']", dialog.$el);
+        statusSelection.empty();
+        
+        $("<option/>", {
+            value: dialog.entry.status,
+            text: TokenStatus[dialog.entry.status]
+        }).appendTo(statusSelection);
+
+        _.each(dialog.entry.nextStatuses, function(nextStatus) {
+            $("<option/>", {
+                value: nextStatus,
+                text: TokenStatus[nextStatus]
+            }).appendTo(statusSelection);
+        });
+
         dialog.handler("save", function() {
 
             // save changes
diff --git a/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java b/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
index b67922e4802c5dddde018c15340d588d2717005e..1bd5de66ee8e75017400b1e4ee8d32b563ce84e0 100644
--- a/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
+++ b/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
@@ -193,7 +193,11 @@ public class TokenService extends PKIService implements TokenResource {
         tokenData.setTokenID(tokenRecord.getId());
         tokenData.setUserID(tokenRecord.getUserID());
         tokenData.setType(tokenRecord.getType());
-        tokenData.setStatus(getTokenStatus(tokenRecord));
+
+        TokenStatus status = getTokenStatus(tokenRecord);
+        tokenData.setStatus(status);
+        tokenData.setNextStatuses(transitions.get(status));
+
         tokenData.setAppletID(tokenRecord.getAppletID());
         tokenData.setKeyInfo(tokenRecord.getKeyInfo());
         tokenData.setPolicy(tokenRecord.getPolicy());
@@ -204,7 +208,7 @@ public class TokenService extends PKIService implements TokenResource {
         try {
             tokenID = URLEncoder.encode(tokenID, "UTF-8");
         } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
+            CMS.debug(e);
             throw new PKIException(e.getMessage());
         }
 
@@ -276,7 +280,7 @@ public class TokenService extends PKIService implements TokenResource {
             return createOKResponse(response);
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             throw new PKIException(e.getMessage());
         }
     }
@@ -295,7 +299,7 @@ public class TokenService extends PKIService implements TokenResource {
             return createOKResponse(createTokenData(database.getRecord(tokenID)));
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             throw new PKIException(e.getMessage());
         }
     }
@@ -331,12 +335,12 @@ public class TokenService extends PKIService implements TokenResource {
             return createCreatedResponse(tokenData, tokenData.getLink().getHref());
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             subsystem.tdb.tdbActivity(ActivityDatabase.OP_ADD, tokenRecord,
                 ipAddress, msg, "failure", remoteUser);
             msg = msg + ":" + e;
 
-            throw new PKIException(msg);
+            throw new PKIException(msg, e);
         }
     }
 
@@ -372,13 +376,13 @@ public class TokenService extends PKIService implements TokenResource {
             return createOKResponse(tokenData);
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             subsystem.tdb.tdbActivity(ActivityDatabase.OP_DO_TOKEN, tokenRecord,
                 ipAddress, msg, "failure",
                 remoteUser);
             msg = msg + ":" + e;
 
-            throw new PKIException(msg);
+            throw new PKIException(msg, e);
         }
     }
 
@@ -461,13 +465,13 @@ public class TokenService extends PKIService implements TokenResource {
             return createOKResponse(tokenData);
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             subsystem.tdb.tdbActivity(ActivityDatabase.OP_DO_TOKEN, tokenRecord,
                 ipAddress, msg, "failure",
                 remoteUser);
             msg = msg + ":" + e;
 
-            throw new PKIException(msg);
+            throw new PKIException(msg, e);
         }
     }
 
@@ -518,13 +522,13 @@ public class TokenService extends PKIService implements TokenResource {
             return createOKResponse(tokenData);
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             msg = msg + e;
             subsystem.tdb.tdbActivity(ActivityDatabase.OP_DO_TOKEN, tokenRecord,
                 ipAddress, msg, "failure",
                 remoteUser);
 
-            throw new PKIException(msg);
+            throw new PKIException(msg, e);
         }
     }
 
@@ -556,13 +560,13 @@ public class TokenService extends PKIService implements TokenResource {
             return createNoContentResponse();
 
         } catch (Exception e) {
-            e.printStackTrace();
+            CMS.debug(e);
             subsystem.tdb.tdbActivity(ActivityDatabase.OP_DELETE, tokenRecord,
                 ipAddress, msg, "failure",
                 remoteUser);
             msg = msg + ":" + e;
 
-            throw new PKIException(msg);
+            throw new PKIException(msg, e);
         }
     }
 }
-- 
1.9.3



More information about the Pki-devel mailing list