Autopsy  4.8.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-2018 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 
62  public synchronized static SqliteEamDb getInstance() throws EamDbException {
63  if (instance == null) {
64  instance = new SqliteEamDb();
65  }
66 
67  return instance;
68  }
69 
75  private SqliteEamDb() throws EamDbException {
76  dbSettings = new SqliteEamDbSettings();
77  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
78  }
79 
80  @Override
81  public void shutdownConnections() throws EamDbException {
82  try {
83  synchronized (this) {
84  if (null != connectionPool) {
85  connectionPool.close();
86  connectionPool = null; // force it to be re-created on next connect()
87  }
88  clearCaches();
89  }
90  } catch (SQLException ex) {
91  throw new EamDbException("Failed to close existing database connections.", ex); // NON-NLS
92  }
93  }
94 
95  @Override
96  public void updateSettings() {
97  synchronized (this) {
98  dbSettings.loadSettings();
99  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
100  }
101  }
102 
103  @Override
104  public void saveSettings() {
105  synchronized (this) {
106  dbSettings.saveSettings();
107  }
108  }
109 
110  @Override
111  public void reset() throws EamDbException {
112  try {
113  acquireExclusiveLock();
114 
115  Connection conn = connect();
116 
117  try {
118 
119  Statement dropContent = conn.createStatement();
120  dropContent.executeUpdate("DELETE FROM organizations");
121  dropContent.executeUpdate("DELETE FROM cases");
122  dropContent.executeUpdate("DELETE FROM data_sources");
123  dropContent.executeUpdate("DELETE FROM reference_sets");
124  dropContent.executeUpdate("DELETE FROM artifact_types");
125  dropContent.executeUpdate("DELETE FROM db_info");
126 
127  String instancesTemplate = "DELETE FROM %s_instances";
128  String referencesTemplate = "DELETE FROM global_files";
129  for (CorrelationAttributeInstance.Type type : defaultCorrelationTypes) {
130  dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
131  // FUTURE: support other reference types
132  if (type.getId() == CorrelationAttributeInstance.FILES_TYPE_ID) {
133  dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName()));
134  }
135  }
136 
137  dropContent.executeUpdate("VACUUM");
138  } catch (SQLException ex) {
139  LOGGER.log(Level.WARNING, "Failed to reset database.", ex);
140  } finally {
141  EamDbUtil.closeConnection(conn);
142  }
143 
144  dbSettings.insertDefaultDatabaseContent();
145  } finally {
146  releaseExclusiveLock();
147  }
148  }
149 
154  private void setupConnectionPool() throws EamDbException {
155 
156  if (dbSettings.dbFileExists() == false) {
157  throw new EamDbException("Central repository database missing");
158  }
159 
160  connectionPool = new BasicDataSource();
161  connectionPool.setDriverClassName(dbSettings.getDriver());
162  connectionPool.setUrl(dbSettings.getConnectionURL());
163 
164  // tweak pool configuration
165  connectionPool.setInitialSize(50);
166  connectionPool.setMaxTotal(-1);
167  connectionPool.setMaxIdle(-1);
168  connectionPool.setMaxWaitMillis(1000);
169  connectionPool.setValidationQuery(dbSettings.getValidationQuery());
170  connectionPool.setConnectionInitSqls(Arrays.asList("PRAGMA foreign_keys = ON"));
171  }
172 
180  @Override
181  protected Connection connect() throws EamDbException {
182  synchronized (this) {
183  if (!EamDb.isEnabled()) {
184  throw new EamDbException("Central Repository module is not enabled"); // NON-NLS
185  }
186 
187  if (connectionPool == null) {
188  setupConnectionPool();
189  }
190 
191  try {
192  return connectionPool.getConnection();
193  } catch (SQLException ex) {
194  throw new EamDbException("Error getting connection from connection pool.", ex); // NON-NLS
195  }
196  }
197  }
198 
199  @Override
200  protected String getConflictClause() {
201  // For sqlite, our conflict clause is part of the table schema
202  return "";
203  }
204 
213  @Override
214  public void newDbInfo(String name, String value) throws EamDbException {
215  try {
216  acquireExclusiveLock();
217  super.newDbInfo(name, value);
218  } finally {
219  releaseExclusiveLock();
220  }
221  }
222 
232  @Override
233  public String getDbInfo(String name) throws EamDbException {
234  try {
235  acquireSharedLock();
236  return super.getDbInfo(name);
237  } finally {
238  releaseSharedLock();
239  }
240  }
241 
250  @Override
251  public void updateDbInfo(String name, String value) throws EamDbException {
252  try {
253  acquireExclusiveLock();
254  super.updateDbInfo(name, value);
255  } finally {
256  releaseExclusiveLock();
257  }
258  }
259 
265  @Override
266  public CorrelationCase newCase(Case autopsyCase) throws EamDbException {
267  try {
268  acquireExclusiveLock();
269  return super.newCase(autopsyCase);
270  } finally {
271  releaseExclusiveLock();
272  }
273  }
274 
282  @Override
283  public CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException {
284  try {
285  acquireExclusiveLock();
286  return super.newCase(eamCase);
287  } finally {
288  releaseExclusiveLock();
289  }
290  }
291 
297  @Override
298  public void updateCase(CorrelationCase eamCase) throws EamDbException {
299  try {
300  acquireExclusiveLock();
301  super.updateCase(eamCase);
302  } finally {
303  releaseExclusiveLock();
304  }
305  }
306 
314  @Override
315  public CorrelationCase getCaseByUUID(String caseUUID) throws EamDbException {
316  try {
317  acquireSharedLock();
318  return super.getCaseByUUID(caseUUID);
319  } finally {
320  releaseSharedLock();
321  }
322  }
323 
331  @Override
332  public CorrelationCase getCaseById(int caseId) throws EamDbException {
333  try {
334  acquireSharedLock();
335  return super.getCaseById(caseId);
336  } finally {
337  releaseSharedLock();
338  }
339 
340  }
341 
347  @Override
348  public List<CorrelationCase> getCases() throws EamDbException {
349  try {
350  acquireSharedLock();
351  return super.getCases();
352  } finally {
353  releaseSharedLock();
354  }
355  }
356 
362  @Override
363  public void newDataSource(CorrelationDataSource eamDataSource) throws EamDbException {
364  try {
365  acquireExclusiveLock();
366  super.newDataSource(eamDataSource);
367  } finally {
368  releaseExclusiveLock();
369  }
370  }
371 
381  @Override
382  public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException {
383  try {
384  acquireSharedLock();
385  return super.getDataSource(correlationCase, dataSourceDeviceId);
386  } finally {
387  releaseSharedLock();
388  }
389  }
390 
400  @Override
401  public CorrelationDataSource getDataSourceById(CorrelationCase correlationCase, int dataSourceId) throws EamDbException {
402  try {
403  acquireSharedLock();
404  return super.getDataSourceById(correlationCase, dataSourceId);
405  } finally {
406  releaseSharedLock();
407  }
408  }
409 
415  @Override
416  public List<CorrelationDataSource> getDataSources() throws EamDbException {
417  try {
418  acquireSharedLock();
419  return super.getDataSources();
420  } finally {
421  releaseSharedLock();
422  }
423  }
424 
431  @Override
432  public void addArtifactInstance(CorrelationAttributeInstance eamArtifact) throws EamDbException {
433  try {
434  acquireExclusiveLock();
435  super.addArtifactInstance(eamArtifact);
436  } finally {
437  releaseExclusiveLock();
438  }
439  }
440 
450  @Override
451  public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
452  try {
453  acquireSharedLock();
454  return super.getArtifactInstancesByTypeValue(aType, value);
455  } finally {
456  releaseSharedLock();
457  }
458  }
459 
471  @Override
472  public List<CorrelationAttributeInstance> getArtifactInstancesByPath(CorrelationAttributeInstance.Type aType, String filePath) throws EamDbException {
473  try {
474  acquireSharedLock();
475  return super.getArtifactInstancesByPath(aType, filePath);
476  } finally {
477  releaseSharedLock();
478  }
479  }
480 
492  @Override
493  public Long getCountArtifactInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
494  try {
495  acquireSharedLock();
496  return super.getCountArtifactInstancesByTypeValue(aType, value);
497  } finally {
498  releaseSharedLock();
499  }
500  }
501 
502  @Override
503  public int getFrequencyPercentage(CorrelationAttributeInstance corAttr) throws EamDbException, CorrelationAttributeNormalizationException {
504  try {
505  acquireSharedLock();
506  return super.getFrequencyPercentage(corAttr);
507  } finally {
508  releaseSharedLock();
509  }
510  }
511 
523  @Override
524  public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
525  try {
526  acquireSharedLock();
527  return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value);
528  } finally {
529  releaseSharedLock();
530  }
531  }
532 
533  @Override
534  public Long getCountUniqueDataSources() throws EamDbException {
535  try {
536  acquireSharedLock();
537  return super.getCountUniqueDataSources();
538  } finally {
539  releaseSharedLock();
540  }
541  }
542 
554  @Override
555  public Long getCountArtifactInstancesByCaseDataSource(String caseUUID, String dataSourceID) throws EamDbException {
556  try {
557  acquireSharedLock();
558  return super.getCountArtifactInstancesByCaseDataSource(caseUUID, dataSourceID);
559  } finally {
560  releaseSharedLock();
561  }
562  }
563 
568  @Override
569  public void commitAttributeInstancesBulk() throws EamDbException {
570  try {
571  acquireExclusiveLock();
572  super.commitAttributeInstancesBulk();
573  } finally {
574  releaseExclusiveLock();
575  }
576  }
577 
581  @Override
582  public void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException {
583  try {
584  acquireExclusiveLock();
585  super.bulkInsertCases(cases);
586  } finally {
587  releaseExclusiveLock();
588  }
589  }
590 
601  @Override
602  public void setAttributeInstanceKnownStatus(CorrelationAttributeInstance eamArtifact, TskData.FileKnown knownStatus) throws EamDbException {
603  try {
604  acquireExclusiveLock();
605  super.setAttributeInstanceKnownStatus(eamArtifact, knownStatus);
606  } finally {
607  releaseExclusiveLock();
608  }
609  }
610 
620  @Override
621  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
622  try {
623  acquireSharedLock();
624  return super.getArtifactInstancesKnownBad(aType, value);
625  } finally {
626  releaseSharedLock();
627  }
628  }
629 
639  @Override
640  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType) throws EamDbException {
641  try {
642  acquireSharedLock();
643  return super.getArtifactInstancesKnownBad(aType);
644  } finally {
645  releaseSharedLock();
646  }
647  }
648 
657  @Override
658  public Long getCountArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
659  try {
660  acquireSharedLock();
661  return super.getCountArtifactInstancesKnownBad(aType, value);
662  } finally {
663  releaseSharedLock();
664  }
665  }
666 
679  @Override
680  public List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
681  try {
682  acquireSharedLock();
683  return super.getListCasesHavingArtifactInstancesKnownBad(aType, value);
684  } finally {
685  releaseSharedLock();
686  }
687  }
688 
695  @Override
696  public void deleteReferenceSet(int referenceSetID) throws EamDbException {
697  try {
698  acquireExclusiveLock();
699  super.deleteReferenceSet(referenceSetID);
700  } finally {
701  releaseExclusiveLock();
702  }
703  }
704 
713  @Override
714  public boolean isValueInReferenceSet(String value, int referenceSetID, int correlationTypeID) throws EamDbException, CorrelationAttributeNormalizationException {
715  try {
716  acquireSharedLock();
717  return super.isValueInReferenceSet(value, referenceSetID, correlationTypeID);
718  } finally {
719  releaseSharedLock();
720  }
721  }
722 
730  @Override
731  public void processInstanceTable(CorrelationAttributeInstance.Type type, InstanceTableCallback instanceTableCallback) throws EamDbException {
732  try {
733  acquireSharedLock();
734  super.processInstanceTable(type, instanceTableCallback);
735  } finally {
736  releaseSharedLock();
737  }
738  }
739 
747  @Override
748  public void processInstanceTableWhere(CorrelationAttributeInstance.Type type, String whereClause, InstanceTableCallback instanceTableCallback) throws EamDbException {
749  try {
750  acquireSharedLock();
751  super.processInstanceTableWhere(type, whereClause, instanceTableCallback);
752  } finally {
753  releaseSharedLock();
754  }
755  }
756 
767  @Override
768  public boolean referenceSetExists(String referenceSetName, String version) throws EamDbException {
769  try {
770  acquireSharedLock();
771  return super.referenceSetExists(referenceSetName, version);
772  } finally {
773  releaseSharedLock();
774  }
775  }
776 
785  @Override
786  public boolean isArtifactKnownBadByReference(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
787  try {
788  acquireSharedLock();
789  return super.isArtifactKnownBadByReference(aType, value);
790  } finally {
791  releaseSharedLock();
792  }
793  }
794 
804  @Override
805  public EamOrganization newOrganization(EamOrganization eamOrg) throws EamDbException {
806  try {
807  acquireExclusiveLock();
808  return super.newOrganization(eamOrg);
809  } finally {
810  releaseExclusiveLock();
811  }
812  }
813 
821  @Override
822  public List<EamOrganization> getOrganizations() throws EamDbException {
823  try {
824  acquireSharedLock();
825  return super.getOrganizations();
826  } finally {
827  releaseSharedLock();
828  }
829  }
830 
840  @Override
841  public EamOrganization getOrganizationByID(int orgID) throws EamDbException {
842  try {
843  acquireSharedLock();
844  return super.getOrganizationByID(orgID);
845  } finally {
846  releaseSharedLock();
847  }
848  }
849 
850  @Override
851  public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException {
852  try {
853  acquireExclusiveLock();
854  super.updateOrganization(updatedOrganization);
855  } finally {
856  releaseExclusiveLock();
857  }
858  }
859 
860  @Override
861  public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException {
862  try {
863  acquireExclusiveLock();
864  super.deleteOrganization(organizationToDelete);
865  } finally {
866  releaseExclusiveLock();
867  }
868  }
869 
879  @Override
880  public int newReferenceSet(EamGlobalSet eamGlobalSet) throws EamDbException {
881  try {
882  acquireExclusiveLock();
883  return super.newReferenceSet(eamGlobalSet);
884  } finally {
885  releaseExclusiveLock();
886  }
887  }
888 
898  @Override
899  public EamGlobalSet getReferenceSetByID(int referenceSetID) throws EamDbException {
900  try {
901  acquireSharedLock();
902  return super.getReferenceSetByID(referenceSetID);
903  } finally {
904  releaseSharedLock();
905  }
906  }
907 
917  @Override
918  public List<EamGlobalSet> getAllReferenceSets(CorrelationAttributeInstance.Type correlationType) throws EamDbException {
919  try {
920  acquireSharedLock();
921  return super.getAllReferenceSets(correlationType);
922  } finally {
923  releaseSharedLock();
924  }
925  }
926 
935  @Override
936  public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttributeInstance.Type correlationType) throws EamDbException {
937  try {
938  acquireExclusiveLock();
939  super.addReferenceInstance(eamGlobalFileInstance, correlationType);
940  } finally {
941  releaseExclusiveLock();
942  }
943  }
944 
950  @Override
951  public void bulkInsertReferenceTypeEntries(Set<EamGlobalFileInstance> globalInstances, CorrelationAttributeInstance.Type contentType) throws EamDbException {
952  try {
953  acquireExclusiveLock();
954  super.bulkInsertReferenceTypeEntries(globalInstances, contentType);
955  } finally {
956  releaseExclusiveLock();
957  }
958  }
959 
970  @Override
971  public List<EamGlobalFileInstance> getReferenceInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String aValue) throws EamDbException, CorrelationAttributeNormalizationException {
972  try {
973  acquireSharedLock();
974  return super.getReferenceInstancesByTypeValue(aType, aValue);
975  } finally {
976  releaseSharedLock();
977  }
978  }
979 
989  @Override
990  public int newCorrelationType(CorrelationAttributeInstance.Type newType) throws EamDbException {
991  try {
992  acquireExclusiveLock();
993  return super.newCorrelationType(newType);
994  } finally {
995  releaseExclusiveLock();
996  }
997  }
998 
1008  @Override
1009  public List<CorrelationAttributeInstance.Type> getDefinedCorrelationTypes() throws EamDbException {
1010  try {
1011  acquireSharedLock();
1012  return super.getDefinedCorrelationTypes();
1013  } finally {
1014  releaseSharedLock();
1015  }
1016  }
1017 
1027  @Override
1028  public List<CorrelationAttributeInstance.Type> getEnabledCorrelationTypes() throws EamDbException {
1029  try {
1030  acquireSharedLock();
1031  return super.getEnabledCorrelationTypes();
1032  } finally {
1033  releaseSharedLock();
1034  }
1035  }
1036 
1046  @Override
1047  public List<CorrelationAttributeInstance.Type> getSupportedCorrelationTypes() throws EamDbException {
1048  try {
1049  acquireSharedLock();
1050  return super.getSupportedCorrelationTypes();
1051  } finally {
1052  releaseSharedLock();
1053  }
1054  }
1055 
1063  @Override
1064  public void updateCorrelationType(CorrelationAttributeInstance.Type aType) throws EamDbException {
1065  try {
1066  acquireExclusiveLock();
1067  super.updateCorrelationType(aType);
1068  } finally {
1069  releaseExclusiveLock();
1070  }
1071  }
1072 
1082  @Override
1083  public CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId) throws EamDbException {
1084  try {
1085  acquireSharedLock();
1086  return super.getCorrelationTypeById(typeId);
1087  } finally {
1088  releaseSharedLock();
1089  }
1090  }
1091 
1097  @Override
1098  public void upgradeSchema() throws EamDbException, SQLException {
1099  try {
1100  acquireExclusiveLock();
1101  super.upgradeSchema();
1102  } finally {
1103  releaseExclusiveLock();
1104  }
1105  }
1106 
1117  @Override
1118  public CoordinationService.Lock getExclusiveMultiUserDbLock() throws EamDbException {
1119  // Multiple users are not supported for SQLite
1120  return null;
1121  }
1122 
1128  private void acquireExclusiveLock() {
1129  rwLock.writeLock().lock();
1130  }
1131 
1137  private void releaseExclusiveLock() {
1138  rwLock.writeLock().unlock();
1139  }
1140 
1146  private void acquireSharedLock() {
1147  rwLock.readLock().lock();
1148  }
1149 
1155  private void releaseSharedLock() {
1156  rwLock.readLock().unlock();
1157  }
1158 
1159 }

Copyright © 2012-2018 Basis Technology. Generated on: Thu Oct 4 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.