Package org.apache.abdera.security.util.filters

Source Code of org.apache.abdera.security.util.filters.SignedResponseFilter$SigningResponseContextWrapper

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.  For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.security.util.filters;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;

import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
import org.apache.abdera.protocol.server.Filter;
import org.apache.abdera.protocol.server.FilterChain;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.ResponseContext;
import org.apache.abdera.protocol.server.context.ResponseContextWrapper;
import org.apache.abdera.security.AbderaSecurity;
import org.apache.abdera.security.SecurityException;
import org.apache.abdera.security.Signature;
import org.apache.abdera.security.SignatureOptions;
import org.apache.abdera.writer.Writer;

/**
* <p>
* This HTTP Servlet Filter will add an XML Digital Signature to Abdera documents
* </p>
*
* <pre>
* &lt;filter>
*   &lt;filter-name>signing filter&lt;/filter-name>
*   &lt;filter-class>org.apache.abdera.security.util.servlet.SignedResponseFilter&lt;/filter-class>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.Keystore&lt;/param-name>
*     &lt;param-value>/key.jks&lt;/param-value>
*   &lt;/init-param>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.KeystorePassword&lt;/param-name>
*     &lt;param-value>testing&lt;/param-value>
*   &lt;/init-param>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.PrivateKeyAlias&lt;/param-name>
*     &lt;param-value>James&lt;/param-value>
*   &lt;/init-param>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.PrivateKeyPassword&lt;/param-name>
*     &lt;param-value>testing&lt;/param-value>
*   &lt;/init-param>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.CertificateAlias&lt;/param-name>
*     &lt;param-value>James&lt;/param-value>
*   &lt;/init-param>
*   &lt;init-param>
*     &lt;param-name>org.apache.abdera.security.util.servlet.SigningAlgorithm&lt;/param-name>
*     &lt;param-value>http://www.w3.org/2000/09/xmldsig#rsa-sha1&lt;/param-value>
*   &lt;/init-param>
* &lt;/filter>
* &lt;filter-mapping id="signing-filter">
*   &lt;filter-name>signing filter&lt;/filter-name>
*   &lt;servlet-name>Abdera&lt;/servlet-name>
* &lt;/filter-mapping>
* </pre>
*/
public class SignedResponseFilter implements Filter {

    private static final String keystoreType = "JKS";

    private String keystoreFile = null;
    private String keystorePass = null;
    private String privateKeyAlias = null;
    private String privateKeyPass = null;
    private String certificateAlias = null;
    private String algorithm = null;
    private PrivateKey signingKey = null;
    private X509Certificate cert = null;

    public SignedResponseFilter(String keystoreFile,
                                String keystorePass,
                                String privateKeyAlias,
                                String privateKeyPass,
                                String certificateAlias,
                                String algorithm) {
        this.keystoreFile = keystoreFile;
        this.keystorePass = keystorePass;
        this.privateKeyAlias = privateKeyAlias;
        this.privateKeyPass = privateKeyPass;
        this.certificateAlias = certificateAlias;
        this.algorithm = algorithm;
        try {
            KeyStore ks = KeyStore.getInstance(keystoreType);
            InputStream in = SignedResponseFilter.class.getResourceAsStream(keystoreFile);
            ks.load(in, keystorePass.toCharArray());
            signingKey = (PrivateKey)ks.getKey(privateKeyAlias, privateKeyPass.toCharArray());
            cert = (X509Certificate)ks.getCertificate(certificateAlias);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ResponseContext filter(RequestContext request, FilterChain chain) {
        return new SigningResponseContextWrapper(request.getAbdera(), chain.next(request));
    }

    private Document<Element> signDocument(Abdera abdera, Document<Element> doc) throws SecurityException {
        AbderaSecurity security = new AbderaSecurity(abdera);
        if (signingKey == null || cert == null)
            return doc; // pass through
        Signature sig = security.getSignature();
        SignatureOptions options = sig.getDefaultSignatureOptions();
        options.setCertificate(cert);
        options.setSigningKey(signingKey);
        if (algorithm != null)
            options.setSigningAlgorithm(algorithm);
        Element element = doc.getRoot();
        element = sig.sign(element, options);
        return element.getDocument();
    }

    private class SigningResponseContextWrapper extends ResponseContextWrapper {

        private final Abdera abdera;

        public SigningResponseContextWrapper(Abdera abdera, ResponseContext response) {
            super(response);
            this.abdera = abdera;
        }

        public void writeTo(OutputStream out, Writer writer) throws IOException {
            try {
                sign(out, null);
            } catch (Exception se) {
                throw new RuntimeException(se);
            }
        }

        public void writeTo(OutputStream out) throws IOException {
            try {
                sign(out, null);
            } catch (Exception se) {
                throw new RuntimeException(se);
            }
        }

        private void sign(OutputStream aout, Writer writer) throws Exception {
            Document<Element> doc = null;
            try {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                if (writer == null)
                    super.writeTo(out);
                else
                    super.writeTo(out, writer);
                ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
                doc = abdera.getParser().parse(in);
            } catch (Exception e) {
            }
            if (doc != null) {
                doc = signDocument(abdera, doc);
                doc.writeTo(aout);
            } else {
                super.writeTo(aout);
            }
        }
    }

    public String getKeystoreFile() {
        return keystoreFile;
    }

    public void setKeystoreFile(String keystoreFile) {
        this.keystoreFile = keystoreFile;
    }

    public String getKeystorePass() {
        return keystorePass;
    }

    public void setKeystorePass(String keystorePass) {
        this.keystorePass = keystorePass;
    }

    public String getPrivateKeyAlias() {
        return privateKeyAlias;
    }

    public void setPrivateKeyAlias(String privateKeyAlias) {
        this.privateKeyAlias = privateKeyAlias;
    }

    public String getPrivateKeyPass() {
        return privateKeyPass;
    }

    public void setPrivateKeyPass(String privateKeyPass) {
        this.privateKeyPass = privateKeyPass;
    }

    public String getCertificateAlias() {
        return certificateAlias;
    }

    public void setCertificateAlias(String certificateAlias) {
        this.certificateAlias = certificateAlias;
    }

    public String getAlgorithm() {
        return algorithm;
    }

    public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
    }

    public PrivateKey getSigningKey() {
        return signingKey;
    }

    public void setSigningKey(PrivateKey signingKey) {
        this.signingKey = signingKey;
    }

    public X509Certificate getCert() {
        return cert;
    }

    public void setCert(X509Certificate cert) {
        this.cert = cert;
    }

    public static String getKeystoreType() {
        return keystoreType;
    }
}
TOP

Related Classes of org.apache.abdera.security.util.filters.SignedResponseFilter$SigningResponseContextWrapper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.