001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.console.keystores;
018
019 import org.apache.commons.logging.Log;
020 import org.apache.commons.logging.LogFactory;
021 import org.apache.geronimo.console.MultiPageModel;
022 import org.apache.geronimo.management.geronimo.KeystoreException;
023 import org.apache.geronimo.crypto.CertificateUtil;
024
025 import javax.portlet.ActionRequest;
026 import javax.portlet.ActionResponse;
027 import javax.portlet.PortletException;
028 import javax.portlet.RenderRequest;
029 import javax.portlet.RenderResponse;
030
031 import java.io.ByteArrayInputStream;
032 import java.io.IOException;
033 import java.io.InputStream;
034 import java.security.NoSuchAlgorithmException;
035 import java.security.cert.CertificateException;
036 import java.security.cert.CertificateFactory;
037 import java.security.cert.X509Certificate;
038 import java.text.SimpleDateFormat;
039 import java.util.Collection;
040
041 /**
042 * Handler for entering a password to unlock a keystore
043 *
044 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
045 */
046 public class ConfirmCertificateHandler extends BaseKeystoreHandler {
047 private final static Log log = LogFactory.getLog(ConfirmCertificateHandler.class);
048
049 public ConfirmCertificateHandler() {
050 super(CONFIRM_CERTIFICATE, "/WEB-INF/view/keystore/confirmCertificate.jsp");
051 }
052
053 public String actionBeforeView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
054 return getMode();
055 }
056
057 public void renderView(RenderRequest request, RenderResponse response, MultiPageModel model) throws PortletException, IOException {
058 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
059 request.setAttribute("id", request.getParameter("id"));
060 request.setAttribute("alias", request.getParameter("alias"));
061 /* // Uploading certificate using a disk file fails on Windows. Certificate text is used instead.
062 String certFile = request.getParameter("certificate");
063 request.setAttribute("certificate", certFile);
064 InputStream is = new FileInputStream(certFile);
065 */
066 String certificate = request.getParameter("certificate");
067 request.setAttribute("certificate", certificate);
068 InputStream is = new ByteArrayInputStream(certificate.getBytes());
069 try {
070 CertificateFactory cf = CertificateFactory.getInstance("X.509");
071 Collection certificates = cf.generateCertificates(is);
072 X509Certificate cert = (X509Certificate) certificates.iterator().next();
073 request.setAttribute("fingerprint", CertificateUtil.generateFingerprint(cert, "MD5"));
074 request.setAttribute("issuer", cert.getIssuerDN().getName());
075 request.setAttribute("subject", cert.getSubjectDN().getName());
076 request.setAttribute("serial", cert.getSerialNumber());
077 request.setAttribute("validStart", sdf.format(cert.getNotBefore()));
078 request.setAttribute("validEnd", sdf.format(cert.getNotAfter()));
079 } catch (CertificateException e) {
080 log.error("Unable to process uploaded certificate", e);
081 } catch (NoSuchAlgorithmException e) {
082 log.error("Unable to process uploaded certificate", e);
083 }
084 }
085
086 public String actionAfterView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
087 String id = request.getParameter("id");
088 String alias = request.getParameter("alias");
089 String certificate = request.getParameter("certificate");
090 if(id == null || id.equals("") || alias == null || alias.equals("") || certificate == null || certificate.equals("")) {
091 return LIST_MODE+BEFORE_ACTION; //todo: better handling
092 }
093 KeystoreData data = ((KeystoreData) request.getPortletSession(true).getAttribute(KEYSTORE_DATA_PREFIX + id));
094 try {
095 data.importTrustCert(certificate, alias);
096 } catch (KeystoreException e) {
097 throw new PortletException(e);
098 }
099 response.setRenderParameter("id", id);
100 return VIEW_KEYSTORE+BEFORE_ACTION;
101 }
102 }