/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * 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.httpsessions; import java.awt.EventQueue; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.table.AbstractTableModel; import org.parosproxy.paros.Constant; import org.parosproxy.paros.view.View; /** * The Class HttpSessionsTableModel that is used as a TableModel for the Http Sessions Panel. */ public class HttpSessionsTableModel extends AbstractTableModel { private static final long serialVersionUID = -6380136823410869457L; /** The column names. */ private static final String[] COLUMN_NAMES = { Constant.messages.getString("httpsessions.table.header.active"), Constant.messages.getString("httpsessions.table.header.name"), Constant.messages.getString("httpsessions.table.header.tokens"), Constant.messages.getString("httpsessions.table.header.matched") }; /** The Constant defining the COLUMN COUNT. */ private static final int COLUMN_COUNT = COLUMN_NAMES.length; /** The http sessions. */ private ArrayList<HttpSession> sessions; /** The site. */ private HttpSessionsSite site; /** The Constant activeIcon defining the image used for marking the active session. */ private static final ImageIcon activeIcon; static { activeIcon = new ImageIcon(HttpSessionsTableModel.class.getResource("/resource/icon/16/102.png")); } /** * Instantiates a new http sessions table model. */ public HttpSessionsTableModel(HttpSessionsSite site) { super(); this.site = site; sessions = new ArrayList<>(2); } @Override public int getColumnCount() { return COLUMN_COUNT; } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } @Override public int getRowCount() { return sessions.size(); } @Override public Object getValueAt(int row, int col) { // Check if the row is valid if (row >= sessions.size()) { return null; } // Get the session and the required field HttpSession session = sessions.get(row); switch (col) { case 0: if (session.isActive()) return activeIcon; else return null; case 1: return session.getName(); case 2: return session.getTokenValuesString(); case 3: return session.getMessagesMatched(); default: return null; } } /** * Removes all the elements. */ public void removeAllElements() { if (View.isInitialised() && !EventQueue.isDispatchThread()) { EventQueue.invokeLater(new Runnable() { @Override public void run() { removeAllElements(); } }); return; } sessions.clear(); sessions.trimToSize(); fireTableDataChanged(); } /** * Adds a new http session to the model. * * @param session the session */ public void addHttpSession(final HttpSession session) { if (View.isInitialised() && !EventQueue.isDispatchThread()) { EventQueue.invokeLater(new Runnable() { @Override public void run() { addHttpSession(session); } }); return; } if (sessions.contains(session)) return; sessions.add(session); final int affectedRow = sessions.size() - 1; fireTableRowsInserted(affectedRow, affectedRow); } /** * All cells besides the ones in the second column ("Session name") are not editable. * * @param row the row * @param col the column * @return true, if is cell is editable */ @Override public boolean isCellEditable(int row, int col) { if (col == 1) return true; else return false; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // Allow change only for the name column if (columnIndex == 1) { site.renameHttpSession(sessions.get(rowIndex).getName(), (String) aValue); } } /** * Returns the type of column for given column index. * * @param columnIndex the column index * @return the column class */ @Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return ImageIcon.class; case 1: return String.class; case 2: return String.class; case 3: return Integer.class; } return null; } /** * Gets the http session at a particular row index. * * @param rowIndex the row index * @return the http session at the given index, or null */ protected HttpSession getHttpSessionAt(int rowIndex) { if (rowIndex < 0 || rowIndex >= sessions.size()) return null; return sessions.get(rowIndex); } /** * Removes the http session. * * @param session the session */ public void removeHttpSession(final HttpSession session) { if (View.isInitialised() && !EventQueue.isDispatchThread()) { EventQueue.invokeLater(new Runnable() { @Override public void run() { removeHttpSession(session); } }); return; } int index = sessions.indexOf(session); sessions.remove(index); fireTableRowsDeleted(index, index); } /** * Notifies the model that a http session has been updated. * * @param session the session */ public void fireHttpSessionUpdated(final HttpSession session) { if (View.isInitialised() && !EventQueue.isDispatchThread()) { EventQueue.invokeLater(new Runnable() { @Override public void run() { fireHttpSessionUpdated(session); } }); return; } int index = sessions.indexOf(session); fireTableRowsUpdated(index, index); } }