Autopsy  4.7.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
SqliteEamDb.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2015-2017 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.centralrepository.datamodel;
20 
21 import java.sql.Connection;
22 import java.sql.SQLException;
23 import java.sql.Statement;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Set;
27 import java.util.concurrent.locks.ReentrantReadWriteLock;
28 import java.util.logging.Level;
29 import org.apache.commons.dbcp2.BasicDataSource;
31 import org.sleuthkit.datamodel.TskData;
34 
40 final class SqliteEamDb extends AbstractSqlEamDb {
41 
42  private final static Logger LOGGER = Logger.getLogger(SqliteEamDb.class.getName());
43 
44  private static SqliteEamDb instance;
45 
46  private BasicDataSource connectionPool = null;
47 
48  private final SqliteEamDbSettings dbSettings;
49 
50  // While the Sqlite database should only be used for single users, it is still
51  // possible for multiple threads to attempt to write to the database simultaneously.
52  private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);
53 
61  public synchronized static SqliteEamDb getInstance() throws EamDbException {
62  if (instance == null) {
63  instance = new SqliteEamDb();
64  }
65 
66  return instance;
67  }
68 
74  private SqliteEamDb() throws EamDbException {
75  dbSettings = new SqliteEamDbSettings();
76  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
77  }
78 
79  @Override
80  public void shutdownConnections() throws EamDbException {
81  try {
82  synchronized(this) {
83  if (null != connectionPool) {
84  connectionPool.close();
85  connectionPool = null; // force it to be re-created on next connect()
86  }
87  }
88  } catch (SQLException ex) {
89  throw new EamDbException("Failed to close existing database connections.", ex); // NON-NLS
90  }
91  }
92 
93  @Override
94  public void updateSettings() {
95  synchronized (this) {
96  dbSettings.loadSettings();
97  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
98  }
99  }
100 
101  @Override
102  public void saveSettings() {
103  synchronized (this) {
104  dbSettings.saveSettings();
105  }
106  }
107 
108  @Override
109  public void reset() throws EamDbException {
110  try{
111  acquireExclusiveLock();
112 
113  Connection conn = connect();
114 
115  try {
116 
117  Statement dropContent = conn.createStatement();
118  dropContent.executeUpdate("DELETE FROM organizations");
119  dropContent.executeUpdate("DELETE FROM cases");
120  dropContent.executeUpdate("DELETE FROM data_sources");
121  dropContent.executeUpdate("DELETE FROM reference_sets");
122  dropContent.executeUpdate("DELETE FROM artifact_types");
123  dropContent.executeUpdate("DELETE FROM db_info");
124 
125  String instancesTemplate = "DELETE FROM %s_instances";
126  String referencesTemplate = "DELETE FROM global_files";
127  for (CorrelationAttribute.Type type : defaultCorrelationTypes) {
128  dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
129  // FUTURE: support other reference types
130  if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) {
131  dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName()));
132  }
133  }
134 
135  dropContent.executeUpdate("VACUUM");
136  } catch (SQLException ex) {
137  LOGGER.log(Level.WARNING, "Failed to reset database.", ex);
138  } finally {
139  EamDbUtil.closeConnection(conn);
140  }
141 
142  dbSettings.insertDefaultDatabaseContent();
143  } finally {
144  releaseExclusiveLock();
145  }
146  }
147 
152  private void setupConnectionPool() throws EamDbException {
153 
154  if (dbSettings.dbFileExists() == false) {
155  throw new EamDbException("Central repository database missing");
156  }
157 
158  connectionPool = new BasicDataSource();
159  connectionPool.setDriverClassName(dbSettings.getDriver());
160  connectionPool.setUrl(dbSettings.getConnectionURL());
161 
162  // tweak pool configuration
163  connectionPool.setInitialSize(50);
164  connectionPool.setMaxTotal(-1);
165  connectionPool.setMaxIdle(-1);
166  connectionPool.setMaxWaitMillis(1000);
167  connectionPool.setValidationQuery(dbSettings.getValidationQuery());
168  connectionPool.setConnectionInitSqls(Arrays.asList("PRAGMA foreign_keys = ON"));
169  }
170 
178  @Override
179  protected Connection connect() throws EamDbException {
180  synchronized (this) {
181  if (!EamDb.isEnabled()) {
182  throw new EamDbException("Central Repository module is not enabled"); // NON-NLS
183  }
184 
185  if (connectionPool == null) {
186  setupConnectionPool();
187  }
188 
189  try {
190  return connectionPool.getConnection();
191  } catch (SQLException ex) {
192  throw new EamDbException("Error getting connection from connection pool.", ex); // NON-NLS
193  }
194  }
195  }
196 
197  @Override
198  protected String getConflictClause() {
199  // For sqlite, our conflict clause is part of the table schema
200  return "";
201  }
202 
203 
212  @Override
213  public void newDbInfo(String name, String value) throws EamDbException {
214  try{
215  acquireExclusiveLock();
216  super.newDbInfo(name, value);
217  } finally {
218  releaseExclusiveLock();
219  }
220  }
221 
231  @Override
232  public String getDbInfo(String name) throws EamDbException {
233  try{
234  acquireSharedLock();
235  return super.getDbInfo(name);
236  } finally {
237  releaseSharedLock();
238  }
239  }
240 
249  @Override
250  public void updateDbInfo(String name, String value) throws EamDbException {
251  try{
252  acquireExclusiveLock();
253  super.updateDbInfo(name, value);
254  } finally {
255  releaseExclusiveLock();
256  }
257  }
258 
264  @Override
265  public CorrelationCase newCase(Case autopsyCase) throws EamDbException {
266  try{
267  acquireExclusiveLock();
268  return super.newCase(autopsyCase);
269  } finally {
270  releaseExclusiveLock();
271  }
272  }
273 
281  @Override
282  public CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException {
283  try{
284  acquireExclusiveLock();
285  return super.newCase(eamCase);
286  } finally {
287  releaseExclusiveLock();
288  }
289  }
290 
296  @Override
297  public void updateCase(CorrelationCase eamCase) throws EamDbException {
298  try{
299  acquireExclusiveLock();
300  super.updateCase(eamCase);
301  } finally {
302  releaseExclusiveLock();
303  }
304  }
305 
313  @Override
314  public CorrelationCase getCaseByUUID(String caseUUID) throws EamDbException {
315  try{
316  acquireSharedLock();
317  return super.getCaseByUUID(caseUUID);
318  } finally {
319  releaseSharedLock();
320  }
321  }
322 
328  @Override
329  public List<CorrelationCase> getCases() throws EamDbException {
330  try{
331  acquireSharedLock();
332  return super.getCases();
333  } finally {
334  releaseSharedLock();
335  }
336  }
337 
343  @Override
344  public void newDataSource(CorrelationDataSource eamDataSource) throws EamDbException {
345  try{
346  acquireExclusiveLock();
347  super.newDataSource(eamDataSource);
348  } finally {
349  releaseExclusiveLock();
350  }
351  }
352 
361  @Override
362  public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException {
363  try{
364  acquireSharedLock();
365  return super.getDataSource(correlationCase, dataSourceDeviceId);
366  } finally {
367  releaseSharedLock();
368  }
369  }
370 
376  @Override
377  public List<CorrelationDataSource> getDataSources() throws EamDbException {
378  try{
379  acquireSharedLock();
380  return super.getDataSources();
381  } finally {
382  releaseSharedLock();
383  }
384  }
385 
392  @Override
393  public void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException {
394  try{
395  acquireExclusiveLock();
396  super.addArtifact(eamArtifact);
397  } finally {
398  releaseExclusiveLock();
399  }
400  }
401 
411  @Override
412  public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
413  try{
414  acquireSharedLock();
415  return super.getArtifactInstancesByTypeValue(aType, value);
416  } finally {
417  releaseSharedLock();
418  }
419  }
420 
432  @Override
433  public List<CorrelationAttributeInstance> getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException {
434  try{
435  acquireSharedLock();
436  return super.getArtifactInstancesByPath(aType, filePath);
437  } finally {
438  releaseSharedLock();
439  }
440  }
441 
453  @Override
454  public Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
455  try{
456  acquireSharedLock();
457  return super.getCountArtifactInstancesByTypeValue(aType, value);
458  } finally {
459  releaseSharedLock();
460  }
461  }
462 
463  @Override
464  public int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException {
465  try{
466  acquireSharedLock();
467  return super.getFrequencyPercentage(corAttr);
468  } finally {
469  releaseSharedLock();
470  }
471  }
472 
484  @Override
485  public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
486  try{
487  acquireSharedLock();
488  return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value);
489  } finally {
490  releaseSharedLock();
491  }
492  }
493 
494 
495  @Override
496  public Long getCountUniqueDataSources() throws EamDbException {
497  try{
498  acquireSharedLock();
499  return super.getCountUniqueDataSources();
500  } finally {
501  releaseSharedLock();
502  }
503  }
504 
516  @Override
517  public Long getCountArtifactInstancesByCaseDataSource(String caseUUID, String dataSourceID) throws EamDbException {
518  try{
519  acquireSharedLock();
520  return super.getCountArtifactInstancesByCaseDataSource(caseUUID, dataSourceID);
521  } finally {
522  releaseSharedLock();
523  }
524  }
525 
530  @Override
531  public void bulkInsertArtifacts() throws EamDbException {
532  try{
533  acquireExclusiveLock();
534  super.bulkInsertArtifacts();
535  } finally {
536  releaseExclusiveLock();
537  }
538  }
539 
543  @Override
544  public void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException {
545  try{
546  acquireExclusiveLock();
547  super.bulkInsertCases(cases);
548  } finally {
549  releaseExclusiveLock();
550  }
551  }
552 
563  @Override
564  public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException {
565  try{
566  acquireExclusiveLock();
567  super.setArtifactInstanceKnownStatus(eamArtifact, knownStatus);
568  } finally {
569  releaseExclusiveLock();
570  }
571  }
572 
582  @Override
583  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
584  try{
585  acquireSharedLock();
586  return super.getArtifactInstancesKnownBad(aType, value);
587  } finally {
588  releaseSharedLock();
589  }
590  }
591 
600  @Override
601  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType) throws EamDbException {
602  try{
603  acquireSharedLock();
604  return super.getArtifactInstancesKnownBad(aType);
605  } finally {
606  releaseSharedLock();
607  }
608  }
609 
618  @Override
619  public Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
620  try{
621  acquireSharedLock();
622  return super.getCountArtifactInstancesKnownBad(aType, value);
623  } finally {
624  releaseSharedLock();
625  }
626  }
627 
640  @Override
641  public List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
642  try{
643  acquireSharedLock();
644  return super.getListCasesHavingArtifactInstancesKnownBad(aType, value);
645  } finally {
646  releaseSharedLock();
647  }
648  }
649 
655  @Override
656  public void deleteReferenceSet(int referenceSetID) throws EamDbException{
657  try{
658  acquireExclusiveLock();
659  super.deleteReferenceSet(referenceSetID);
660  } finally {
661  releaseExclusiveLock();
662  }
663  }
664 
672  @Override
673  public boolean isValueInReferenceSet(String value, int referenceSetID, int correlationTypeID) throws EamDbException {
674  try{
675  acquireSharedLock();
676  return super.isValueInReferenceSet(value, referenceSetID, correlationTypeID);
677  } finally {
678  releaseSharedLock();
679  }
680  }
681 
689  @Override
690  public void processInstanceTable(CorrelationAttribute.Type type, InstanceTableCallback instanceTableCallback) throws EamDbException {
691  try {
692  acquireSharedLock();
693  super.processInstanceTable(type, instanceTableCallback);
694  } finally {
695  releaseSharedLock();
696  }
697  }
706  @Override
707  public boolean referenceSetExists(String referenceSetName, String version) throws EamDbException {
708  try{
709  acquireSharedLock();
710  return super.referenceSetExists(referenceSetName, version);
711  } finally {
712  releaseSharedLock();
713  }
714  }
715 
724  @Override
725  public boolean isArtifactKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException {
726  try{
727  acquireSharedLock();
728  return super.isArtifactKnownBadByReference(aType, value);
729  } finally {
730  releaseSharedLock();
731  }
732  }
733 
743  @Override
744  public EamOrganization newOrganization(EamOrganization eamOrg) throws EamDbException {
745  try{
746  acquireExclusiveLock();
747  return super.newOrganization(eamOrg);
748  } finally {
749  releaseExclusiveLock();
750  }
751  }
752 
760  @Override
761  public List<EamOrganization> getOrganizations() throws EamDbException {
762  try{
763  acquireSharedLock();
764  return super.getOrganizations();
765  } finally {
766  releaseSharedLock();
767  }
768  }
769 
779  @Override
780  public EamOrganization getOrganizationByID(int orgID) throws EamDbException {
781  try{
782  acquireSharedLock();
783  return super.getOrganizationByID(orgID);
784  } finally {
785  releaseSharedLock();
786  }
787  }
788 
789  @Override
790  public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException {
791  try{
792  acquireExclusiveLock();
793  super.updateOrganization(updatedOrganization);
794  } finally {
795  releaseExclusiveLock();
796  }
797  }
798 
799  @Override
800  public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException {
801  try{
802  acquireExclusiveLock();
803  super.deleteOrganization(organizationToDelete);
804  } finally {
805  releaseExclusiveLock();
806  }
807  }
817  @Override
818  public int newReferenceSet(EamGlobalSet eamGlobalSet) throws EamDbException {
819  try{
820  acquireExclusiveLock();
821  return super.newReferenceSet(eamGlobalSet);
822  } finally {
823  releaseExclusiveLock();
824  }
825  }
826 
836  @Override
837  public EamGlobalSet getReferenceSetByID(int referenceSetID) throws EamDbException {
838  try{
839  acquireSharedLock();
840  return super.getReferenceSetByID(referenceSetID);
841  } finally {
842  releaseSharedLock();
843  }
844  }
845 
855  @Override
856  public List<EamGlobalSet> getAllReferenceSets(CorrelationAttribute.Type correlationType) throws EamDbException {
857  try{
858  acquireSharedLock();
859  return super.getAllReferenceSets(correlationType);
860  } finally {
861  releaseSharedLock();
862  }
863  }
864 
874  @Override
875  public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException {
876  try{
877  acquireExclusiveLock();
878  super.addReferenceInstance(eamGlobalFileInstance, correlationType);
879  } finally {
880  releaseExclusiveLock();
881  }
882  }
883 
889  @Override
890  public void bulkInsertReferenceTypeEntries(Set<EamGlobalFileInstance> globalInstances, CorrelationAttribute.Type contentType) throws EamDbException {
891  try{
892  acquireExclusiveLock();
893  super.bulkInsertReferenceTypeEntries(globalInstances, contentType);
894  } finally {
895  releaseExclusiveLock();
896  }
897  }
898 
909  @Override
910  public List<EamGlobalFileInstance> getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException {
911  try{
912  acquireSharedLock();
913  return super.getReferenceInstancesByTypeValue(aType, aValue);
914  } finally {
915  releaseSharedLock();
916  }
917  }
918 
928  @Override
929  public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException {
930  try{
931  acquireExclusiveLock();
932  return super.newCorrelationType(newType);
933  } finally {
934  releaseExclusiveLock();
935  }
936  }
937 
947  @Override
948  public List<CorrelationAttribute.Type> getDefinedCorrelationTypes() throws EamDbException {
949  try{
950  acquireSharedLock();
951  return super.getDefinedCorrelationTypes();
952  } finally {
953  releaseSharedLock();
954  }
955  }
956 
966  @Override
967  public List<CorrelationAttribute.Type> getEnabledCorrelationTypes() throws EamDbException {
968  try{
969  acquireSharedLock();
970  return super.getEnabledCorrelationTypes();
971  } finally {
972  releaseSharedLock();
973  }
974  }
975 
985  @Override
986  public List<CorrelationAttribute.Type> getSupportedCorrelationTypes() throws EamDbException {
987  try{
988  acquireSharedLock();
989  return super.getSupportedCorrelationTypes();
990  } finally {
991  releaseSharedLock();
992  }
993  }
994 
1002  @Override
1003  public void updateCorrelationType(CorrelationAttribute.Type aType) throws EamDbException {
1004  try{
1005  acquireExclusiveLock();
1006  super.updateCorrelationType(aType);
1007  } finally {
1008  releaseExclusiveLock();
1009  }
1010  }
1011 
1021  @Override
1022  public CorrelationAttribute.Type getCorrelationTypeById(int typeId) throws EamDbException {
1023  try{
1024  acquireSharedLock();
1025  return super.getCorrelationTypeById(typeId);
1026  } finally {
1027  releaseSharedLock();
1028  }
1029  }
1030 
1035  @Override
1036  public void upgradeSchema() throws EamDbException, SQLException {
1037  try{
1038  acquireExclusiveLock();
1039  super.upgradeSchema();
1040  } finally {
1041  releaseExclusiveLock();
1042  }
1043  }
1044 
1053  @Override
1054  public CoordinationService.Lock getExclusiveMultiUserDbLock() throws EamDbException{
1055  // Multiple users are not supported for SQLite
1056  return null;
1057  }
1058 
1064  private void acquireExclusiveLock() {
1065  rwLock.writeLock().lock();
1066  }
1067 
1073  private void releaseExclusiveLock() {
1074  rwLock.writeLock().unlock();
1075  }
1076 
1082  private void acquireSharedLock() {
1083  rwLock.readLock().lock();
1084  }
1085 
1091  private void releaseSharedLock() {
1092  rwLock.readLock().unlock();
1093  }
1094 
1095 }

Copyright © 2012-2016 Basis Technology. Generated on: Mon Jun 18 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.