diff options
Diffstat (limited to 'base/common')
11 files changed, 262 insertions, 37 deletions
diff --git a/base/common/src/CMakeLists.txt b/base/common/src/CMakeLists.txt index 01ff33e47..ea9077f74 100644 --- a/base/common/src/CMakeLists.txt +++ b/base/common/src/CMakeLists.txt @@ -579,6 +579,7 @@ set(pki-cms_java_SRCS com/netscape/cms/servlet/base/IndexServlet.java com/netscape/cms/servlet/base/UserInfo.java com/netscape/cms/servlet/base/PortsServlet.java + com/netscape/cms/servlet/base/CMSException.java com/netscape/cms/servlet/base/CMSResourceService.java com/netscape/cms/servlet/base/CMSServlet.java com/netscape/cms/servlet/base/CMSStartServlet.java @@ -664,6 +665,7 @@ set(pki-cms_java_SRCS com/netscape/cms/servlet/request/IReqParser.java com/netscape/cms/servlet/request/ReqParser.java com/netscape/cms/servlet/request/QueryReq.java + com/netscape/cms/servlet/request/RequestNotFoundException.java com/netscape/cms/servlet/request/SearchReqs.java com/netscape/cms/servlet/request/ProcessCertReq.java com/netscape/cms/servlet/request/CertReqParser.java diff --git a/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java b/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java index f998bf97a..b8bb1870b 100644 --- a/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java +++ b/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java @@ -95,6 +95,17 @@ public class KeyId { return value.toString(); } + /** + * Converts the KeyId into its hex string representation. The string + * form can be stored in a database (such as the LDAP directory) + * + * @return + * a string containing the hex (hex 16) value for the identifier. + */ + public String toHexString() { + return "0x"+value.toString(16); + } + @Override public int hashCode() { final int prime = 31; diff --git a/base/common/src/com/netscape/certsrv/request/RequestId.java b/base/common/src/com/netscape/certsrv/request/RequestId.java index da61f2bc0..b643fa30d 100644 --- a/base/common/src/com/netscape/certsrv/request/RequestId.java +++ b/base/common/src/com/netscape/certsrv/request/RequestId.java @@ -94,6 +94,17 @@ public class RequestId { return value.toString(); } + /** + * Converts the RequestId into its hex string representation. The string + * form can be stored in a database (such as the LDAP directory) + * + * @return + * a string containing the hex (base 16) value for the identifier. + */ + public String toHexString() { + return "0x"+value.toString(16); + } + @Override public int hashCode() { final int prime = 31; diff --git a/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java b/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java index 48f410c73..4dccb141f 100644 --- a/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java @@ -21,8 +21,6 @@ package com.netscape.cms.servlet.admin; import java.security.cert.CertificateEncodingException; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import com.netscape.certsrv.apps.CMS; @@ -39,9 +37,6 @@ import com.netscape.cms.servlet.cert.model.CertificateData; */ public class SystemCertificateResourceService extends CMSResourceService implements SystemCertificateResource { - @Context - Request request; - /** * Used to retrieve the transport certificate */ @@ -74,7 +69,7 @@ public class SystemCertificateResourceService extends CMSResourceService impleme e.printStackTrace(); throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); } - return sendConditionalGetResponse(DEFAULT_LONG_CACHE_LIFETIME, cert, request); + return sendConditionalGetResponse(DEFAULT_LONG_CACHE_LIFETIME, cert); } } diff --git a/base/common/src/com/netscape/cms/servlet/base/CMSException.java b/base/common/src/com/netscape/cms/servlet/base/CMSException.java new file mode 100644 index 000000000..eda5566ac --- /dev/null +++ b/base/common/src/com/netscape/cms/servlet/base/CMSException.java @@ -0,0 +1,165 @@ +package com.netscape.cms.servlet.base; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; +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; + +public class CMSException extends RuntimeException { + + private static final long serialVersionUID = 6000910362260369923L; + + public int code; + + public CMSException(String message) { + super(message); + code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(); + } + + public CMSException(int code, String message) { + super(message); + this.code = code; + } + + public CMSException(Response.Status status, String message) { + super(message); + code = status.getStatusCode(); + } + + public CMSException(String message, Throwable cause) { + super(message, cause); + code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(); + } + + public CMSException(int code, String message, Throwable cause) { + super(message, cause); + this.code = code; + } + + public CMSException(Response.Status status, String message, Throwable cause) { + super(message, cause); + code = status.getStatusCode(); + } + + public CMSException(Data data) { + super(data.message); + code = data.code; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Data getData() { + Data data = new Data(); + data.className = getClass().getName(); + data.code = code; + data.message = getMessage(); + return data; + } + + @XmlRootElement(name="CMSException") + public static class Data { + + @XmlElement(name="ClassName") + public String className; + + @XmlElement(name="Code") + public int code; + + @XmlElement(name="Message") + public String message; + + @XmlElement(name="Attributes") + @XmlJavaTypeAdapter(MapAdapter.class) + public Map<String, String> attributes = new LinkedHashMap<String, String>(); + + public String getAttribute(String name) { + return attributes.get(name); + } + + public void setAttribute(String name, String value) { + attributes.put(name, value); + } + } + + public static class MapAdapter extends XmlAdapter<AttributeList, Map<String, String>> { + + public AttributeList marshal(Map<String, String> map) { + AttributeList list = new AttributeList(); + for (Map.Entry<String, String> entry : map.entrySet()) { + Attribute attribute = new Attribute(); + attribute.name = entry.getKey(); + attribute.value = entry.getValue(); + list.attributes.add(attribute); + } + return list; + } + + public Map<String, String> unmarshal(AttributeList list) { + Map<String, String> map = new LinkedHashMap<String, String>(); + for (Attribute attribute : list.attributes) { + map.put(attribute.name, attribute.value); + } + return map; + } + } + + public static class AttributeList { + @XmlElement(name="Attribute") + public List<Attribute> attributes = new ArrayList<Attribute>(); + } + + public static class Attribute { + + @XmlAttribute + public String name; + + @XmlValue + public String value; + } + + @Provider + public static class Mapper implements ExceptionMapper<CMSException> { + + public Response toResponse(CMSException exception) { + // convert CMSException into HTTP response with XML content + return Response + .status(exception.getCode()) + .entity(exception.getData()) + .type(MediaType.TEXT_XML) + .build(); + } + } + + public static void main(String args[]) throws Exception { + Data data = new Data(); + data.className = CMSException.class.getName(); + data.code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(); + data.message = "An error has occured"; + data.setAttribute("attr1", "value1"); + data.setAttribute("attr2", "value2"); + + JAXBContext context = JAXBContext.newInstance(Data.class); + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.marshal(data, System.out); + } +} diff --git a/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java b/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java index acddba559..24c3cd74d 100644 --- a/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java @@ -20,9 +20,11 @@ package com.netscape.cms.servlet.base; import java.security.cert.CertificateEncodingException; import javax.ws.rs.core.CacheControl; +import javax.ws.rs.core.Context; import javax.ws.rs.core.EntityTag; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.Response.ResponseBuilder; import com.netscape.certsrv.apps.CMS; @@ -35,13 +37,24 @@ import com.netscape.cms.servlet.cert.model.CertificateData; * */ public class CMSResourceService { + public static final String HEADER = "-----BEGIN NEW CERTIFICATE REQUEST-----"; public static final String TRAILER = "-----END NEW CERTIFICATE REQUEST-----"; // caching parameters - protected static final int DEFAULT_LONG_CACHE_LIFETIME = 1000; + public static final int DEFAULT_LONG_CACHE_LIFETIME = 1000; + + @Context + protected UriInfo uriInfo; + + @Context + protected Request request; + + public Response createOKResponse(Object object) { + return Response.ok(object).build(); + } - protected Response sendConditionalGetResponse(int ctime, Object object, Request request) { + public Response sendConditionalGetResponse(int ctime, Object object) { CacheControl cc = new CacheControl(); cc.setMaxAge(ctime); EntityTag tag = new EntityTag(Integer.toString(object.hashCode())); diff --git a/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java b/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java index 79e6ccfdb..88f2f8a82 100644 --- a/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java @@ -20,10 +20,8 @@ package com.netscape.cms.servlet.key; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import com.netscape.cms.servlet.base.CMSResourceService; import com.netscape.cms.servlet.key.model.KeyDAO; @@ -43,9 +41,6 @@ import com.netscape.certsrv.dbs.keydb.KeyId; */ public class KeyResourceService extends CMSResourceService implements KeyResource{ - @Context - UriInfo uriInfo; - /** * Used to retrieve a key * @param data diff --git a/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java b/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java index a7876a6c6..d525d5a77 100644 --- a/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java @@ -21,9 +21,7 @@ package com.netscape.cms.servlet.key; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import com.netscape.certsrv.apps.CMS; import com.netscape.certsrv.base.EBaseException; @@ -38,9 +36,6 @@ import com.netscape.cmsutil.ldap.LDAPUtil; */ public class KeysResourceService extends CMSResourceService implements KeysResource { - @Context - UriInfo uriInfo; - /** * Used to generate list of key infos based on the search parameters */ diff --git a/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java b/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java index 43e58bbdc..b9ba206c1 100644 --- a/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java @@ -19,27 +19,24 @@ package com.netscape.cms.servlet.request; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; + import com.netscape.certsrv.base.EBaseException; import com.netscape.certsrv.request.RequestId; +import com.netscape.cms.servlet.base.CMSException; import com.netscape.cms.servlet.base.CMSResourceService; import com.netscape.cms.servlet.request.model.ArchivalRequestData; import com.netscape.cms.servlet.request.model.KeyRequestDAO; import com.netscape.cms.servlet.request.model.KeyRequestInfo; import com.netscape.cms.servlet.request.model.RecoveryRequestData; - + /** * @author alee - * + * */ public class KeyRequestResourceService extends CMSResourceService implements KeyRequestResource { - @Context - UriInfo uriInfo; - /** * Used to retrieve key request info for a specific request */ @@ -52,15 +49,15 @@ public class KeyRequestResourceService extends CMSResourceService implements Key } catch (EBaseException e) { // log error e.printStackTrace(); - throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); + throw new CMSException(e.getMessage(), e); } if (info == null) { // request does not exist - throw new WebApplicationException(Response.Status.NOT_FOUND); + throw new RequestNotFoundException(id); } return info; } - + // Archiving - used to test integration with a browser public KeyRequestInfo archiveKey(MultivaluedMap<String, String> form) { ArchivalRequestData data = new ArchivalRequestData(form); @@ -88,7 +85,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key } return info; } - + //Recovery - used to test integration with a browser public KeyRequestInfo recoverKey(MultivaluedMap<String, String> form) { RecoveryRequestData data = new RecoveryRequestData(form); @@ -117,7 +114,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key } return info; } - + public void approveRequest(RequestId id) { if (id == null) { throw new WebApplicationException(Response.Status.BAD_REQUEST); @@ -132,7 +129,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); } } - + public void rejectRequest(RequestId id) { if (id == null) { throw new WebApplicationException(Response.Status.BAD_REQUEST); @@ -147,7 +144,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); } } - + public void cancelRequest(RequestId id) { if (id == null) { throw new WebApplicationException(Response.Status.BAD_REQUEST); diff --git a/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java b/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java index 11898ef7a..82b1efa07 100644 --- a/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java +++ b/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java @@ -19,9 +19,7 @@ package com.netscape.cms.servlet.request; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import com.netscape.certsrv.apps.CMS; import com.netscape.certsrv.base.EBaseException; @@ -37,9 +35,6 @@ import com.netscape.cmsutil.ldap.LDAPUtil; */ public class KeyRequestsResourceService extends CMSResourceService implements KeyRequestsResource{ - @Context - UriInfo uriInfo; - /** * Used to generate list of key requests based on the search parameters */ diff --git a/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java b/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java new file mode 100644 index 000000000..5d6b5563b --- /dev/null +++ b/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java @@ -0,0 +1,46 @@ +package com.netscape.cms.servlet.request; + +import javax.ws.rs.core.Response; + +import com.netscape.certsrv.request.RequestId; +import com.netscape.cms.servlet.base.CMSException; + +public class RequestNotFoundException extends CMSException { + + private static final long serialVersionUID = -4784839378360933483L; + + public RequestId requestId; + + public RequestNotFoundException(RequestId requestId) { + this(requestId, "Request ID "+requestId.toHexString()+" not found"); + } + + public RequestNotFoundException(RequestId requestId, String message) { + super(Response.Status.NOT_FOUND, message); + this.requestId = requestId; + } + + public RequestNotFoundException(RequestId requestId, String message, Throwable cause) { + super(Response.Status.NOT_FOUND, message, cause); + this.requestId = requestId; + } + + public RequestNotFoundException(Data data) { + super(data); + requestId = new RequestId(data.getAttribute("requestId")); + } + + public Data getData() { + Data data = super.getData(); + data.setAttribute("requestId", requestId.toString()); + return data; + } + + public RequestId getRequestId() { + return requestId; + } + + public void setRequestId(RequestId requestId) { + this.requestId = requestId; + } +} |