/* * 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(); } }