org.zaproxy.zap.extension.encoder2.EncodeDecodeDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.zaproxy.zap.extension.encoder2.EncodeDecodeDialog.java

Source

/*
 * Zed Attack Proxy (ZAP) and its related class files.
 *
 * ZAP is an HTTP/HTTPS proxy for assessing web application security.
 *
 * Copyright 2010 psiinon@gmail.com
 *
 * Licensed 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.
 */
package org.zaproxy.zap.extension.encoder2;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.extension.encoder.Encoder;
import org.parosproxy.paros.view.AbstractFrame;
import org.parosproxy.paros.view.View;
import org.zaproxy.zap.utils.FontUtils;
import org.zaproxy.zap.utils.ZapTextArea;

public class EncodeDecodeDialog extends AbstractFrame {

    private static final long serialVersionUID = 1L;

    public static final String ENCODE_DECODE_FIELD = "EncodeDecodeInputField";
    public static final String ENCODE_DECODE_RESULTFIELD = "EncodeDecodeResultField";

    private static final Logger log = Logger.getLogger(EncodeDecodeDialog.class);

    private JTabbedPane jTabbed = null;
    private JPanel jPanel = null;

    private ZapTextArea inputField = null;
    private ZapTextArea base64EncodeField = null;
    private ZapTextArea base64DecodeField = null;
    private ZapTextArea urlEncodeField = null;
    private ZapTextArea urlDecodeField = null;
    private ZapTextArea asciiHexEncodeField = null;
    private ZapTextArea asciiHexDecodeField = null;
    private ZapTextArea HTMLEncodeField = null;//
    private ZapTextArea HTMLDecodeField = null;//
    private ZapTextArea JavaScriptEncodeField = null;//
    private ZapTextArea JavaScriptDecodeField = null;//
    private ZapTextArea sha1HashField = null;
    private ZapTextArea md5HashField = null;
    private ZapTextArea illegalUTF82ByteField = null;
    private ZapTextArea illegalUTF83ByteField = null;
    private ZapTextArea illegalUTF84ByteField = null;

    private Encoder encoder = null;

    /**
     * @throws HeadlessException
     */
    public EncodeDecodeDialog() throws HeadlessException {
        super();
        initialize();
    }

    /**
     * This method initializes this
     */
    private void initialize() {
        this.setAlwaysOnTop(false);
        this.setContentPane(getJTabbed());
        this.setTitle(Constant.messages.getString("enc2.title"));
    }

    private void addField(JPanel parent, int index, JComponent c, String title) {
        final java.awt.GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = index;
        gbc.insets = new java.awt.Insets(1, 1, 1, 1);
        gbc.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gbc.fill = java.awt.GridBagConstraints.BOTH;
        gbc.weightx = 0.5D;
        gbc.weighty = 0.5D;

        final JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(c);
        jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jsp.setBorder(BorderFactory.createTitledBorder(null, title, TitledBorder.DEFAULT_JUSTIFICATION,
                javax.swing.border.TitledBorder.DEFAULT_POSITION, FontUtils.getFont(FontUtils.Size.standard),
                java.awt.Color.black));

        parent.add(jsp, gbc);
    }

    /**
     * This method initializes jPanel
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJTabbed() {
        if (jPanel == null) {
            /*
            jPanel = new JPanel();
            jPanel.setPreferredSize(new java.awt.Dimension(800,600));
                
            jPanel.setLayout(new GridBagLayout());
            */

            // jPanel is the outside one
            jPanel = new JPanel();
            jPanel.setPreferredSize(new java.awt.Dimension(800, 600));
            jPanel.setLayout(new GridBagLayout());

            jTabbed = new JTabbedPane();
            jTabbed.setPreferredSize(new java.awt.Dimension(800, 500));

            final JPanel jPanel1 = new JPanel();
            jPanel1.setLayout(new GridBagLayout());

            final JPanel jPanel2 = new JPanel();
            //jPanel2.setPreferredSize(new java.awt.Dimension(800,500));
            jPanel2.setLayout(new GridBagLayout());

            final JPanel jPanel3 = new JPanel();

            //jPanel3.setPreferredSize(new java.awt.Dimension(800,500));
            jPanel3.setLayout(new GridBagLayout());

            final JPanel jPanel4 = new JPanel();
            jPanel4.setLayout(new GridBagLayout());

            // 3 tabs - Encode, Decode, Hash??
            addField(jPanel1, 1, getBase64EncodeField(), Constant.messages.getString("enc2.label.b64Enc"));
            addField(jPanel1, 2, getUrlEncodeField(), Constant.messages.getString("enc2.label.urlEnc"));
            addField(jPanel1, 3, getAsciiHexEncodeField(), Constant.messages.getString("enc2.label.asciiEnc"));
            addField(jPanel1, 4, getHTMLEncodeField(), Constant.messages.getString("enc2.label.HTMLEnc"));
            addField(jPanel1, 5, getJavaScriptEncodeField(),
                    Constant.messages.getString("enc2.label.JavaScriptEnc"));

            addField(jPanel2, 1, getBase64DecodeField(), Constant.messages.getString("enc2.label.b64Dec"));
            addField(jPanel2, 2, getUrlDecodeField(), Constant.messages.getString("enc2.label.urlDec"));
            addField(jPanel2, 3, getAsciiHexDecodeField(), Constant.messages.getString("enc2.label.asciiDec"));
            addField(jPanel2, 4, getHTMLDecodeField(), Constant.messages.getString("enc2.label.HTMLDec"));
            addField(jPanel2, 5, getJavaScriptDecodeField(),
                    Constant.messages.getString("enc2.label.JavaScriptDec"));

            addField(jPanel3, 1, getSha1HashField(), Constant.messages.getString("enc2.label.sha1Hash"));
            addField(jPanel3, 2, getMd5HashField(), Constant.messages.getString("enc2.label.md5Hash"));

            addField(jPanel4, 1, getIllegalUTF82ByteField(),
                    Constant.messages.getString("enc2.label.illegalUTF8.2byte"));
            addField(jPanel4, 2, getIllegalUTF83ByteField(),
                    Constant.messages.getString("enc2.label.illegalUTF8.3byte"));
            addField(jPanel4, 3, getIllegalUTF84ByteField(),
                    Constant.messages.getString("enc2.label.illegalUTF8.4byte"));

            jTabbed.addTab(Constant.messages.getString("enc2.tab.encode"), jPanel1);
            jTabbed.addTab(Constant.messages.getString("enc2.tab.decode"), jPanel2);
            jTabbed.addTab(Constant.messages.getString("enc2.tab.hash"), jPanel3);
            jTabbed.addTab(Constant.messages.getString("enc2.tab.illegalUTF8"), jPanel4);

            final java.awt.GridBagConstraints gbc1 = new GridBagConstraints();
            gbc1.gridx = 0;
            gbc1.gridy = 1;
            gbc1.insets = new java.awt.Insets(1, 1, 1, 1);
            gbc1.anchor = java.awt.GridBagConstraints.NORTHWEST;
            gbc1.fill = java.awt.GridBagConstraints.BOTH;
            gbc1.weightx = 1.0D;
            gbc1.weighty = 0.25D;

            final java.awt.GridBagConstraints gbc2 = new GridBagConstraints();
            gbc2.gridx = 0;
            gbc2.gridy = 2;
            gbc2.insets = new java.awt.Insets(1, 1, 1, 1);
            gbc2.anchor = java.awt.GridBagConstraints.NORTHWEST;
            gbc2.fill = java.awt.GridBagConstraints.BOTH;
            gbc2.weightx = 1.0D;
            gbc2.weighty = 1.0D;

            final JScrollPane jsp = new JScrollPane();
            jsp.setViewportView(getInputField());
            jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            jsp.setBorder(BorderFactory.createTitledBorder(null, Constant.messages.getString("enc2.label.text"),
                    TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION,
                    FontUtils.getFont(FontUtils.Size.standard), java.awt.Color.black));

            //addField(jPanel, 1, getInputField(), "Text to be encoded/decoded/hashed");
            //addField(jPanel, 2, jTabbed, "Text to be encoded/decoded/hashed");

            jPanel.add(jsp, gbc1);
            jPanel.add(jTabbed, gbc2);

            jPanel2.requestFocus();

        }
        return jPanel;
    }

    private ZapTextArea newField(boolean editable) {
        final ZapTextArea field = new ZapTextArea();
        field.setLineWrap(true);
        field.setBorder(BorderFactory.createEtchedBorder());
        field.setEditable(editable);
        field.setName(ENCODE_DECODE_RESULTFIELD);

        field.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mousePressed(java.awt.event.MouseEvent e) {
                if (SwingUtilities.isRightMouseButton(e)) {
                    View.getSingleton().getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        return field;
    }

    private ZapTextArea getInputField() {
        if (inputField == null) {
            inputField = newField(true);
            inputField.setName(ENCODE_DECODE_FIELD);

            inputField.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent documentEvent) {
                    updateEncodeDecodeFields();
                }

                @Override
                public void removeUpdate(DocumentEvent documentEvent) {
                    updateEncodeDecodeFields();
                }

                @Override
                public void changedUpdate(DocumentEvent documentEvent) {
                }
            });

            inputField.addMouseListener(new java.awt.event.MouseAdapter() {
                @Override
                public void mousePressed(java.awt.event.MouseEvent e) {
                    if (SwingUtilities.isRightMouseButton(e)) {
                        View.getSingleton().getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
                    }
                }
            });
        }
        return inputField;
    }

    private ZapTextArea getBase64EncodeField() {
        if (base64EncodeField == null) {
            base64EncodeField = newField(false);
        }
        return base64EncodeField;
    }

    private ZapTextArea getBase64DecodeField() {
        if (base64DecodeField == null) {
            base64DecodeField = newField(false);
        }
        return base64DecodeField;
    }

    private ZapTextArea getUrlEncodeField() {
        if (urlEncodeField == null) {
            urlEncodeField = newField(false);
        }
        return urlEncodeField;
    }

    private ZapTextArea getUrlDecodeField() {
        if (urlDecodeField == null) {
            urlDecodeField = newField(false);
        }
        return urlDecodeField;
    }

    private ZapTextArea getAsciiHexEncodeField() {
        if (asciiHexEncodeField == null) {
            asciiHexEncodeField = newField(false);
        }
        return asciiHexEncodeField;
    }

    private ZapTextArea getAsciiHexDecodeField() {
        if (asciiHexDecodeField == null) {
            asciiHexDecodeField = newField(false);
        }
        return asciiHexDecodeField;
    }

    private ZapTextArea getHTMLEncodeField() {//
        if (HTMLEncodeField == null) {
            HTMLEncodeField = newField(false);
        }
        return HTMLEncodeField;
    }

    private ZapTextArea getHTMLDecodeField() {//
        if (HTMLDecodeField == null) {
            HTMLDecodeField = newField(false);
        }
        return HTMLDecodeField;
    }

    private ZapTextArea getJavaScriptEncodeField() {//
        if (JavaScriptEncodeField == null) {
            JavaScriptEncodeField = newField(false);
        }
        return JavaScriptEncodeField;
    }

    private ZapTextArea getJavaScriptDecodeField() {//
        if (JavaScriptDecodeField == null) {
            JavaScriptDecodeField = newField(false);
        }
        return JavaScriptDecodeField;
    }

    private ZapTextArea getSha1HashField() {
        if (sha1HashField == null) {
            sha1HashField = newField(false);
        }
        return sha1HashField;
    }

    private ZapTextArea getMd5HashField() {
        if (md5HashField == null) {
            md5HashField = newField(false);
        }
        return md5HashField;
    }

    private ZapTextArea getIllegalUTF82ByteField() {
        if (illegalUTF82ByteField == null) {
            illegalUTF82ByteField = newField(false);
        }
        return illegalUTF82ByteField;
    }

    private ZapTextArea getIllegalUTF83ByteField() {
        if (illegalUTF83ByteField == null) {
            illegalUTF83ByteField = newField(false);
        }
        return illegalUTF83ByteField;
    }

    private ZapTextArea getIllegalUTF84ByteField() {
        if (illegalUTF84ByteField == null) {
            illegalUTF84ByteField = newField(false);
        }
        return illegalUTF84ByteField;
    }

    private Encoder getEncoder() {
        if (encoder == null) {
            encoder = new Encoder();
        }
        return encoder;
    }

    public String decodeHexString(String hexText) {

        String decodedText = "";
        String chunk = null;

        if (hexText != null && hexText.length() > 0) {
            final int numBytes = hexText.length() / 2;

            final byte[] rawToByte = new byte[numBytes];
            int offset = 0;
            for (int i = 0; i < numBytes; i++) {
                chunk = hexText.substring(offset, offset + 2);
                offset += 2;
                rawToByte[i] = (byte) (Integer.parseInt(chunk, 16) & 0x000000FF);
            }
            decodedText = new String(rawToByte);
        }
        return decodedText;
    }

    public String decodeHTMLString(String HTMLText) {
        return StringEscapeUtils.unescapeHtml(HTMLText);
    }

    public String decodeJavaScriptString(String JavaScriptText) {
        return StringEscapeUtils.unescapeJavaScript(JavaScriptText);
    }

    private void updateEncodeDecodeFields() {

        // Base 64
        try {
            base64EncodeField.setText(getEncoder().getBase64Encode(getInputField().getText()));
        } catch (NullPointerException e) {
            log.error(e.getMessage(), e);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }

        try {
            base64DecodeField.setText(getEncoder().getBase64Decode(getInputField().getText()));
            base64DecodeField.setEnabled(base64DecodeField.getText().length() > 0);
        } catch (IOException e) {
            base64DecodeField.setText(e.getMessage());
            base64DecodeField.setEnabled(false);
        } catch (IllegalArgumentException e) {
            base64DecodeField.setText(e.getMessage());
            base64DecodeField.setEnabled(false);
        }

        // URLs
        urlEncodeField.setText(getEncoder().getURLEncode(getInputField().getText()));
        try {
            urlDecodeField.setText(getEncoder().getURLDecode(getInputField().getText()));
        } catch (final Exception e) {
            // Not unexpected
            urlDecodeField.setText("");
        }
        urlDecodeField.setEnabled(urlDecodeField.getText().length() > 0);

        // ASCII Hex
        asciiHexEncodeField.setText(getEncoder().getHexString(getInputField().getText().getBytes()));

        try {
            asciiHexDecodeField.setText(decodeHexString(getInputField().getText()));
        } catch (final Exception e) {
            // Not unexpected
            asciiHexDecodeField.setText("");
        }
        asciiHexDecodeField.setEnabled(asciiHexDecodeField.getText().length() > 0);

        // HTML
        HTMLEncodeField.setText(getEncoder().getHTMLString(getInputField().getText()));

        try {
            HTMLDecodeField.setText(decodeHTMLString(getInputField().getText()));
        } catch (final Exception e) {
            // Not unexpected
            HTMLDecodeField.setText("");
        }
        HTMLDecodeField.setEnabled(HTMLDecodeField.getText().length() > 0);

        // JavaScript
        JavaScriptEncodeField.setText(getEncoder().getJavaScriptString(getInputField().getText()));

        try {
            JavaScriptDecodeField.setText(decodeJavaScriptString(getInputField().getText()));
        } catch (final Exception e) {
            // Not unexpected
            JavaScriptDecodeField.setText("");
        }
        JavaScriptDecodeField.setEnabled(JavaScriptDecodeField.getText().length() > 0);

        // Hashes
        try {
            sha1HashField.setText(
                    getEncoder().getHexString(getEncoder().getHashSHA1(getInputField().getText().getBytes())));
        } catch (final Exception e) {
            sha1HashField.setText("");
        }

        try {
            md5HashField.setText(
                    getEncoder().getHexString(getEncoder().getHashMD5(getInputField().getText().getBytes())));
        } catch (final Exception e) {
            md5HashField.setText("");
        }

        //Illegal UTF8
        try {
            illegalUTF82ByteField.setText(getEncoder().getIllegalUTF8Encode(getInputField().getText(), 2));
        } catch (final Exception e) {
            // Not unexpected
            illegalUTF82ByteField.setText("");
        }

        try {
            illegalUTF83ByteField.setText(getEncoder().getIllegalUTF8Encode(getInputField().getText(), 3));
        } catch (final Exception e) {
            // Not unexpected
            illegalUTF83ByteField.setText("");
        }

        try {
            illegalUTF84ByteField.setText(getEncoder().getIllegalUTF8Encode(getInputField().getText(), 4));
        } catch (final Exception e) {
            // Not unexpected
            illegalUTF84ByteField.setText("");
        }

    }

    public void setInputField(String text) {
        this.getInputField().setText(text);
        this.updateEncodeDecodeFields();
    }

    public void updateOptions(EncodeDecodeParam options) {
        getEncoder().setBase64Charset(options.getBase64Charset());
        getEncoder().setBase64DoBreakLines(options.isBase64DoBreakLines());

        updateEncodeDecodeFields();
    }

}