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

org.parosproxy.paros.db.paros.ParosDatabase Maven / Gradle / Ivy

/*
 *
 * Paros and its related class files.
 *
 * Paros is an HTTP/HTTPS proxy for assessing web application security.
 * Copyright (C) 2003-2004 Chinotec Technologies Company
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Clarified Artistic License
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Clarified Artistic License for more details.
 *
 * You should have received a copy of the Clarified Artistic License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
// ZAP: 2011/05/15 Support for exclusions
// ZAP: 2011/10/29 Support for parameters
// ZAP: 2012/03/15 Changed the parameter's type of the method
// removeDatabaseListener to DatabaseListener instead of SpiderListener. Removed
// unnecessary cast in the method notifyListenerDatabaseOpen.
// ZAP: 2012/05/02 Added the method createSingleton and changed the method
// getSingleton to use it.
// ZAP: 2012/06/11 Added JavaDoc to the method close(boolean), changed the
// method close(boolean) to call the method close(boolean, boolean), added
// method close(boolean, boolean).
// ZAP: 2012/07/16 Removed unused setters.
// ZAP: 2012/10/02 Issue 385: Added support for Contexts
// ZAP: 2013/03/03 Issue 546: Remove all template Javadoc comments
// ZAP: 2015/02/05 Issue 1524: New Persist Session dialog
// ZAP: 2015/02/09 Issue 1525: Introduce a database interface layer to allow for alternative
// implementations
// ZAP: 2015/04/02 Issue 1582: Low memory option
// ZAP: 2016/02/10 Issue 1958: Allow to disable database (HSQLDB) log
// ZAP: 2016/04/22 Issue 2428: Memory leak on session creation/loading
// ZAP: 2016/05/24 Add implementation of Database.discardSession(long)
// ZAP: 2019/06/01 Normalise line endings.
// ZAP: 2019/06/05 Normalise format/style.
// ZAP: 2020/11/26 Use getLogger().
// ZAP: 2021/08/24 Remove the "(non-Javadoc)" comments.
// ZAP: 2021/09/27 Added support for Alert Tags.
package org.parosproxy.paros.db.paros;

import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.parosproxy.paros.db.AbstractDatabase;
import org.parosproxy.paros.db.Database;
import org.parosproxy.paros.db.DatabaseException;
import org.parosproxy.paros.db.DatabaseListener;
import org.parosproxy.paros.db.DatabaseServer;
import org.parosproxy.paros.db.TableAlert;
import org.parosproxy.paros.db.TableContext;
import org.parosproxy.paros.db.TableHistory;
import org.parosproxy.paros.db.TableParam;
import org.parosproxy.paros.db.TableScan;
import org.parosproxy.paros.db.TableSession;
import org.parosproxy.paros.db.TableSessionUrl;
import org.parosproxy.paros.db.TableStructure;
import org.parosproxy.paros.db.TableTag;
import org.parosproxy.paros.extension.option.DatabaseParam;
import org.zaproxy.zap.db.TableAlertTag;
import org.zaproxy.zap.db.paros.ParosTableAlertTag;

public class ParosDatabase extends AbstractDatabase {

    private ParosDatabaseServer databaseServer = null;
    private TableHistory tableHistory = null;
    private TableSession tableSession = null;
    private TableAlert tableAlert = null;
    private TableAlertTag tableAlertTag = null;
    private TableScan tableScan = null;
    // ZAP: Added TableTag
    private TableTag tableTag = null;
    // ZAP: Added TableSessionUrl.
    private TableSessionUrl tableSessionUrl = null;
    // ZAP: Added TableParam.
    private TableParam tableParam = null;
    private TableContext tableContext = null;
    private TableStructure tableStructure = null;

    /**
     * {@code DatabaseListener}s added internally when the {@code SqlDatabase} is constructed.
     *
     * 

These listeners are kept during the lifetime of the database, while dynamically added * listeners are removed once the database is closed. */ private List internalDatabaseListeners = new ArrayList<>(); private DatabaseParam databaseOptions; public ParosDatabase() { tableHistory = new ParosTableHistory(); tableSession = new ParosTableSession(); tableAlert = new ParosTableAlert(); tableAlertTag = new ParosTableAlertTag(); tableScan = new ParosTableScan(); // ZAP: Added statement. tableTag = new ParosTableTag(); // ZAP: Added statement. tableSessionUrl = new ParosTableSessionUrl(); // ZAP: Added statement. tableParam = new ParosTableParam(); tableContext = new ParosTableContext(); tableStructure = new ParosTableStructure(); internalDatabaseListeners.add(tableHistory); internalDatabaseListeners.add(tableSession); internalDatabaseListeners.add(tableAlert); internalDatabaseListeners.add(tableAlertTag); internalDatabaseListeners.add(tableScan); internalDatabaseListeners.add(tableTag); internalDatabaseListeners.add(tableSessionUrl); internalDatabaseListeners.add(tableParam); internalDatabaseListeners.add(tableContext); internalDatabaseListeners.add(tableStructure); } /** @return Returns the databaseServer */ @Override public DatabaseServer getDatabaseServer() { return databaseServer; } /** @param databaseServer The databaseServer to set. */ private void setDatabaseServer(ParosDatabaseServer databaseServer) { this.databaseServer = databaseServer; } @Override public TableHistory getTableHistory() { return tableHistory; } @Override public TableSession getTableSession() { return tableSession; } @Override public void open(String path) throws ClassNotFoundException, Exception { // ZAP: Added log statement. getLogger().debug("open " + path); setDatabaseServer(new ParosDatabaseServer(path, databaseOptions)); notifyListenersDatabaseOpen(internalDatabaseListeners, getDatabaseServer()); notifyListenersDatabaseOpen(getDatabaseServer()); } @Override public void deleteSession(String sessionName) { getLogger().debug("deleteSession " + sessionName); if (databaseServer == null) { return; } try { databaseServer.shutdown(false); } catch (SQLException e) { getLogger().error(e.getMessage(), e); } deleteDbFile(new File(sessionName)); deleteDbFile(new File(sessionName + ".data")); deleteDbFile(new File(sessionName + ".script")); deleteDbFile(new File(sessionName + ".properties")); deleteDbFile(new File(sessionName + ".backup")); deleteDbFile(new File(sessionName + ".lobs")); databaseServer = null; } private void deleteDbFile(File file) { getLogger().debug("Deleting " + file.getAbsolutePath()); if (file.exists()) { if (!file.delete()) { getLogger().error("Failed to delete " + file.getAbsolutePath()); } } } // ZAP: Added method. Note: any change made to this method must have the // ZAP comment as the content was moved from the paros method close(boolean). @Override public void close(boolean compact, boolean cleanup) { // ZAP: Added statement. getLogger().debug("close"); if (databaseServer == null) return; super.close(compact, cleanup); try { // ZAP: Added if block. if (cleanup) { // perform clean up getTableHistory().deleteTemporary(); } // shutdown databaseServer.shutdown(compact); // ZAP: Changed to catch SQLException instead of Exception. } catch (Exception e) { // ZAP: Changed to log the exception. getLogger().error(e.getMessage(), e); } } @Override public TableAlert getTableAlert() { return tableAlert; } @Override public void setTableAlert(TableAlert tableAlert) { this.tableAlert = tableAlert; } @Override public TableAlertTag getTableAlertTag() { return tableAlertTag; } @Override public void setTableAlertTag(TableAlertTag tableAlertTag) { this.tableAlertTag = tableAlertTag; } @Override public TableScan getTableScan() { return tableScan; } @Override public void setTableScan(TableScan tableScan) { this.tableScan = tableScan; } @Override public TableTag getTableTag() { return tableTag; } @Override public void setTableTag(TableTag tableTag) { this.tableTag = tableTag; } // ZAP: Added method. @Override public TableSessionUrl getTableSessionUrl() { return tableSessionUrl; } // ZAP: Added method. @Override public void setTableSessionUrl(TableSessionUrl tableSessionUrl) { this.tableSessionUrl = tableSessionUrl; } // ZAP: Added method. @Override public TableParam getTableParam() { return tableParam; } @Override public TableContext getTableContext() { return tableContext; } @Override public TableStructure getTableStructure() { return tableStructure; } @Override public String getType() { return Database.DB_TYPE_HSQLDB; } /** * Sets the object that holds the database options. * * @param databaseOptions the object that holds the database options, must not be {@code null} * @throws IllegalArgumentException if the given parameter is {@code null}. * @since 2.5.0 */ public void setDatabaseParam(DatabaseParam databaseOptions) { if (databaseOptions == null) { throw new IllegalArgumentException("Parameter databaseOptions must not be null."); } this.databaseOptions = databaseOptions; } @Override public void discardSession(long sessionId) throws DatabaseException { // Do nothing, the database files are going to be deleted anyway. // getTableHistory().deleteHistorySession(sessionId); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy