All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.glassfish.admingui.common.handlers.NewSSLHandlers Maven / Gradle / Ivy

There is a newer version: 7.2024.1.Alpha1
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2013 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */
// Portions Copyright [2019] [Payara Foundation and/or its affiliates]

/*
 * SSLHandlers.java
 *
 * Created on June 25, 2009, 11:30 PM
 *
 */

package org.glassfish.admingui.common.handlers;

import com.sun.jsftemplating.annotation.Handler;
import com.sun.jsftemplating.annotation.HandlerInput;
import com.sun.jsftemplating.annotation.HandlerOutput;
import com.sun.jsftemplating.layout.descriptors.handler.HandlerContext;
import org.glassfish.admingui.common.util.GuiUtil;

import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 *
 * @author anilam
 *
 */
public class NewSSLHandlers {

    private static Set COMMON_CIPHERS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
        "SSL_RSA_WITH_RC4_128_MD5", "SSL_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA",
        "TLS_RSA_WITH_AES_256_CBC_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA"
    )));

    private static Set BIT_CIPHERS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
        "SSL_RSA_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
        "SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
        "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
    )));

    public NewSSLHandlers() {
    }

    @Handler(id="convertToDifferentCiphersGroup",
    input={
        @HandlerInput(name="ciphers")},
    output={
        @HandlerOutput(name="CommonCiphersList",    type=String[].class),
        @HandlerOutput(name="EphemeralCiphersList", type=String[].class),
        @HandlerOutput(name="OtherCiphersList",     type=String[].class),
        @HandlerOutput(name="EccCiphersList",       type=String[].class)}
    )
    public static void convertToDifferentCiphersGroup(HandlerContext handlerCtx) {
        List ciphersList = null;
        Object ciphers = handlerCtx.getInputValue("ciphers");
        if (ciphers != null) {
            if (ciphers instanceof String) {
                ciphersList = Arrays.asList(getSelectedCiphersList((String) ciphers));
            } else {
                ciphersList = Arrays.asList((String[]) ciphers);
            }
        }
        handlerCtx.setOutputValue("CommonCiphersList", getCommonCiphers(ciphersList));
        handlerCtx.setOutputValue("EphemeralCiphersList", getEphemeralCiphers(ciphersList));
        handlerCtx.setOutputValue("OtherCiphersList", getOtherCiphers(ciphersList));
        handlerCtx.setOutputValue("EccCiphersList", getEccCiphers(ciphersList));
    }


    @Handler(id="convertCiphersItemsToStr",
    input={
        @HandlerInput(name="common",    type=String[].class),
        @HandlerInput(name="ephemeral", type=String[].class),
        @HandlerInput(name="other",     type=String[].class),
        @HandlerInput(name="ecc",       type=String[].class)},
    output={
        @HandlerOutput(name="ciphers")}
    )
    public static void convertCiphersItemsToStr(HandlerContext handlerCtx) {

        String[] common = (String[])handlerCtx.getInputValue("common");
        String[] ephemeral = (String[])handlerCtx.getInputValue("ephemeral");
        String[] other = (String[])handlerCtx.getInputValue("other");
        String[] ecc = (String[])handlerCtx.getInputValue("ecc");

        String ciphers = processSelectedCiphers(common, "");
        ciphers = processSelectedCiphers(ephemeral, ciphers);
        ciphers = processSelectedCiphers(other, ciphers);
        ciphers = processSelectedCiphers(ecc, ciphers);

        handlerCtx.setOutputValue("ciphers", ciphers);
    }

    private static String[] getSelectedCiphersList(String selectedCiphers){
        if(selectedCiphers != null){
            return filterCiphers(
                    Arrays.asList(selectedCiphers.split(",")),
                    cipher -> cipher.startsWith("+"),
                    cipher -> cipher.substring(1));
        }
        return new String[0];
    }

    private static String processSelectedCiphers(String[] selectedCiphers, String ciphers){
        StringBuilder sb = new StringBuilder();
        String sep = "";
        if ( ! GuiUtil.isEmpty(ciphers)){
            sb.append(ciphers);
            sep = ",";
        }
        if(selectedCiphers != null){
            for (String selectedCipher : selectedCiphers) {
                sb.append(sep).append("+").append(selectedCipher);
                sep = ",";
            }
        }
        return sb.toString();
    }

    private static String[] getCommonCiphers(List ciphers){
        return filterCiphers(ciphers, cypher -> COMMON_CIPHERS.contains(cypher));
    }

    private static String[] getEccCiphers(List ciphers){
        return filterCiphers(
                ciphers,
                cipher -> !BIT_CIPHERS.contains(cipher) && (cipher.contains("_ECDH_") || cipher.contains("_ECDHE_"))
        );
    }

    private static String[] getEphemeralCiphers(List ciphers){
        return filterCiphers(
                ciphers,
                cipher -> !BIT_CIPHERS.contains(cipher) && (cipher.contains("_DHE_RSA_") || cipher.contains("_DHE_DSS_"))
        );
    }

    private static String[] getOtherCiphers(List ciphers){
        return filterCiphers(ciphers, cypher -> BIT_CIPHERS.contains(cypher));
    }

    private static String[] filterCiphers(List ciphers, Predicate filter){
        return filterCiphers(ciphers, filter, str -> str);
    }

    private static String[] filterCiphers(List ciphers, Predicate filter, Function transformation){
        if (ciphers != null) {
            return ciphers.stream()
                    .filter(filter)
                    .map(transformation)
                    .toArray(String[]::new);
        }
        return new String[0];
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy