/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright The OWASP ZAP Development Team * * 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.db.sql; import java.util.ArrayList; import java.util.List; import org.parosproxy.paros.db.AbstractDatabase; 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; public class SqlDatabase extends AbstractDatabase { private SqlDatabaseServer databaseServer = null; private TableHistory tableHistory = null; private TableSession tableSession = null; private TableAlert tableAlert = null; private TableScan tableScan = null; private TableTag tableTag = null; private TableSessionUrl tableSessionUrl = null; private TableParam tableParam = null; private TableContext tableContext = null; private TableStructure tableStructure = null; /** * {@code DatabaseListener}s added internally when the {@code SqlDatabase} is constructed. * <p> * These listeners are kept during the lifetime of the database, while dynamically added listeners are removed once the * database is closed. */ private final List<DatabaseListener> internalDatabaseListeners = new ArrayList<>(); public SqlDatabase() { tableAlert = new SqlTableAlert(); tableContext = new SqlTableContext(); tableHistory = new SqlTableHistory(); tableParam = new SqlTableParam(); tableScan = new SqlTableScan(); tableSession = new SqlTableSession(); tableSessionUrl = new SqlTableSessionUrl(); tableTag = new SqlTableTag(); tableStructure = new SqlTableStructure(); internalDatabaseListeners.add(DbSQL.getSingleton()); internalDatabaseListeners.add(tableHistory); internalDatabaseListeners.add(tableSession); internalDatabaseListeners.add(tableAlert); 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. */ protected void setDatabaseServer(SqlDatabaseServer databaseServer) { this.databaseServer = databaseServer; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableHistory() */ @Override public TableHistory getTableHistory() { return tableHistory; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableSession() */ @Override public TableSession getTableSession() { return tableSession; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#open(java.lang.String) */ @Override public final void open(String path) throws Exception { // ZAP: Added log statement. logger.debug("open " + path); setDatabaseServer(createDatabaseServer(path)); notifyListenersDatabaseOpen(internalDatabaseListeners, getDatabaseServer()); notifyListenersDatabaseOpen(getDatabaseServer()); } /** * Creates the {@code SqlDatabaseServer} to be used when opening a database. * <p> * Extending classes can use this method to create a custom {@code SqlDatabaseServer} implementation. * * @param path the location of the database server * @return a {@code SqlDatabaseServer} to be used by this database * @throws Exception if an error occurred while creating the {@code SqlDatabaseServer}. * @since 2.5.0 * @see #open(String) */ protected SqlDatabaseServer createDatabaseServer(String path) throws Exception { return new SqlDatabaseServer(path); } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#deleteSession(java.lang.String) */ @Override public void deleteSession(String sessionName) { logger.debug("deleteSession " + sessionName); if (databaseServer == null) { return; } databaseServer = null; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#close(boolean, boolean) */ @Override public void close(boolean compact, boolean cleanup) { // ZAP: Added statement. logger.debug("close"); if (databaseServer == null) { return; } super.close(compact, cleanup); try { // ZAP: Added if block. if (cleanup) { // perform clean up getTableHistory().deleteTemporary(); } } catch (Exception e) { // ZAP: Changed to log the exception. logger.error(e.getMessage(), e); } } public boolean isFileBased () { return false; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableAlert() */ @Override public TableAlert getTableAlert() { return tableAlert; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#setTableAlert(org.parosproxy.paros.db.TableAlert) */ @Override public void setTableAlert(TableAlert tableAlert) { this.tableAlert = tableAlert; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableScan() */ @Override public TableScan getTableScan() { return tableScan; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#setTableScan(org.parosproxy.paros.db.TableScan) */ @Override public void setTableScan(TableScan tableScan) { this.tableScan = tableScan; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableTag() */ @Override public TableTag getTableTag() { return tableTag; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#setTableTag(org.parosproxy.paros.db.TableTag) */ @Override public void setTableTag(TableTag tableTag) { this.tableTag = tableTag; } // ZAP: Added method. /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableSessionUrl() */ @Override public TableSessionUrl getTableSessionUrl() { return tableSessionUrl; } // ZAP: Added method. /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#setTableSessionUrl(org.parosproxy.paros.db.TableSessionUrl) */ @Override public void setTableSessionUrl(TableSessionUrl tableSessionUrl) { this.tableSessionUrl = tableSessionUrl; } // ZAP: Added method. /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableParam() */ @Override public TableParam getTableParam() { return tableParam; } /* (non-Javadoc) * @see org.parosproxy.paros.db.DatabaseIF#getTableContext() */ @Override public TableContext getTableContext() { return tableContext; } @Override public TableStructure getTableStructure() { return tableStructure; } @Override public String getType() { return DbSQL.getDbType(); } @Override public void discardSession(long sessionId) throws DatabaseException { if (!isFileBased()) { getTableHistory().deleteHistorySession(sessionId); } } }