mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-06 21:00:22 +00:00
Added Exif parser ingest module.
This commit is contained in:
parent
ec4822d091
commit
9cb36788a8
8
ExifParser/build.xml
Normal file
8
ExifParser/build.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
|
||||||
|
<!-- for some information on what you could do (e.g. targets to override). -->
|
||||||
|
<!-- If you delete this file and reopen the project it will be recreated. -->
|
||||||
|
<project name="org.sleuthkit.autopsy.exifparser" default="netbeans" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.exifextract.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
</project>
|
5
ExifParser/manifest.mf
Normal file
5
ExifParser/manifest.mf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
OpenIDE-Module: org.sleuthkit.autopsy.exifparser
|
||||||
|
OpenIDE-Module-Layer: org/sleuthkit/autopsy/exifparser/layer.xml
|
||||||
|
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/exifparser/Bundle.properties
|
||||||
|
OpenIDE-Module-Specification-Version: 1.0
|
45
ExifParser/nbproject/build-impl.xml
Normal file
45
ExifParser/nbproject/build-impl.xml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||||
|
*** EDIT ../build.xml INSTEAD ***
|
||||||
|
-->
|
||||||
|
<project name="org.sleuthkit.autopsy.exifextract-impl" basedir="..">
|
||||||
|
<fail message="Please build using Ant 1.7.1 or higher.">
|
||||||
|
<condition>
|
||||||
|
<not>
|
||||||
|
<antversion atleast="1.7.1"/>
|
||||||
|
</not>
|
||||||
|
</condition>
|
||||||
|
</fail>
|
||||||
|
<property file="nbproject/private/suite-private.properties"/>
|
||||||
|
<property file="nbproject/suite.properties"/>
|
||||||
|
<fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
|
||||||
|
<property file="${suite.dir}/nbproject/private/platform-private.properties"/>
|
||||||
|
<property file="${suite.dir}/nbproject/platform.properties"/>
|
||||||
|
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||||
|
<attribute name="name"/>
|
||||||
|
<attribute name="value"/>
|
||||||
|
<sequential>
|
||||||
|
<property name="@{name}" value="${@{value}}"/>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||||
|
<attribute name="property"/>
|
||||||
|
<attribute name="value"/>
|
||||||
|
<sequential>
|
||||||
|
<property name="@{property}" value="@{value}"/>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
<property file="${user.properties.file}"/>
|
||||||
|
<nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||||
|
<nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||||
|
<nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||||
|
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
|
||||||
|
<condition>
|
||||||
|
<not>
|
||||||
|
<contains string="${cluster.path.evaluated}" substring="platform"/>
|
||||||
|
</not>
|
||||||
|
</condition>
|
||||||
|
</fail>
|
||||||
|
<import file="${harness.dir}/build.xml"/>
|
||||||
|
</project>
|
3
ExifParser/nbproject/project.properties
Normal file
3
ExifParser/nbproject/project.properties
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
javac.source=1.6
|
||||||
|
javac.compilerargs=-Xlint -Xlint:-serial
|
||||||
|
spec.version.base=0.0
|
39
ExifParser/nbproject/project.xml
Normal file
39
ExifParser/nbproject/project.xml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.apisupport.project</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
|
||||||
|
<code-name-base>org.sleuthkit.autopsy.exifparser</code-name-base>
|
||||||
|
<suite-component/>
|
||||||
|
<module-dependencies>
|
||||||
|
<dependency>
|
||||||
|
<code-name-base>org.sleuthkit.autopsy.datamodel</code-name-base>
|
||||||
|
<build-prerequisite/>
|
||||||
|
<compile-dependency/>
|
||||||
|
<run-dependency>
|
||||||
|
<release-version>1</release-version>
|
||||||
|
<specification-version>1.0</specification-version>
|
||||||
|
</run-dependency>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<code-name-base>org.sleuthkit.autopsy.ingest</code-name-base>
|
||||||
|
<build-prerequisite/>
|
||||||
|
<compile-dependency/>
|
||||||
|
<run-dependency>
|
||||||
|
<release-version>0-1</release-version>
|
||||||
|
<specification-version>1.0</specification-version>
|
||||||
|
</run-dependency>
|
||||||
|
</dependency>
|
||||||
|
</module-dependencies>
|
||||||
|
<public-packages/>
|
||||||
|
<class-path-extension>
|
||||||
|
<runtime-relative-path>ext/xmpcore.jar</runtime-relative-path>
|
||||||
|
<binary-origin>release/modules/ext/xmpcore.jar</binary-origin>
|
||||||
|
</class-path-extension>
|
||||||
|
<class-path-extension>
|
||||||
|
<runtime-relative-path>ext/metadata-extractor-2.6.2.jar</runtime-relative-path>
|
||||||
|
<binary-origin>release/modules/ext/metadata-extractor-2.6.2.jar</binary-origin>
|
||||||
|
</class-path-extension>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
1
ExifParser/nbproject/suite.properties
Normal file
1
ExifParser/nbproject/suite.properties
Normal file
@ -0,0 +1 @@
|
|||||||
|
suite.dir=${basedir}/..
|
202
ExifParser/release/modules/ext/LICENSE-2.0.txt
Normal file
202
ExifParser/release/modules/ext/LICENSE-2.0.txt
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
18
ExifParser/release/modules/ext/README.txt
Normal file
18
ExifParser/release/modules/ext/README.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Copyright 2002-2012 Drew Noakes
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
More information about this project is available at:
|
||||||
|
|
||||||
|
http://drewnoakes.com/code/exif/
|
||||||
|
http://code.google.com/p/metadata-extractor/
|
BIN
ExifParser/release/modules/ext/metadata-extractor-2.6.2.jar
Normal file
BIN
ExifParser/release/modules/ext/metadata-extractor-2.6.2.jar
Normal file
Binary file not shown.
BIN
ExifParser/release/modules/ext/xmpcore.jar
Normal file
BIN
ExifParser/release/modules/ext/xmpcore.jar
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
OpenIDE-Module-Name=ExifParser
|
@ -0,0 +1,254 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2011 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* 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.sleuthkit.autopsy.exifparser;
|
||||||
|
|
||||||
|
import com.drew.imaging.ImageMetadataReader;
|
||||||
|
import com.drew.imaging.ImageProcessingException;
|
||||||
|
import com.drew.metadata.Metadata;
|
||||||
|
import com.drew.metadata.exif.ExifIFD0Directory;
|
||||||
|
import com.drew.metadata.exif.ExifSubIFDDirectory;
|
||||||
|
import com.drew.metadata.exif.GpsDirectory;
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestManagerProxy;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestMessage;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestMessage.MessageType;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestServiceAbstract;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestServiceAbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
|
||||||
|
import org.sleuthkit.datamodel.FsContent;
|
||||||
|
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example implementation of an image ingest service
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class ExifParserFileIngestService implements IngestServiceAbstractFile {
|
||||||
|
|
||||||
|
final String MODULE_NAME = "Exif Parser";
|
||||||
|
private static final Logger logger = Logger.getLogger(ExifParserFileIngestService.class.getName());
|
||||||
|
private static ExifParserFileIngestService defaultInstance = null;
|
||||||
|
private IngestManagerProxy managerProxy;
|
||||||
|
private static int messageId = 0;
|
||||||
|
|
||||||
|
//public constructor is required
|
||||||
|
//as multiple instances are created for processing multiple images simultenously
|
||||||
|
public ExifParserFileIngestService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
//default instance used for service registration
|
||||||
|
public static synchronized ExifParserFileIngestService getDefault() {
|
||||||
|
if (defaultInstance == null) {
|
||||||
|
defaultInstance = new ExifParserFileIngestService();
|
||||||
|
}
|
||||||
|
return defaultInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IngestServiceAbstractFile.ProcessResult process(AbstractFile content) {
|
||||||
|
if(content.getType().equals(TSK_DB_FILES_TYPE_ENUM.FS)) {
|
||||||
|
FsContent fsContent = (FsContent) content;
|
||||||
|
if(fsContent.isFile()) {
|
||||||
|
if(parsableFormat(fsContent)) {
|
||||||
|
return processFile(fsContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return IngestServiceAbstractFile.ProcessResult.UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IngestServiceAbstractFile.ProcessResult processFile(FsContent f) {
|
||||||
|
InputStream in = null;
|
||||||
|
BufferedInputStream bin = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
in = new ReadContentInputStream(f);
|
||||||
|
bin = new BufferedInputStream(in);
|
||||||
|
|
||||||
|
Collection<BlackboardAttribute> attributes = new ArrayList<BlackboardAttribute>();
|
||||||
|
Metadata metadata = ImageMetadataReader.readMetadata(bin, true);
|
||||||
|
|
||||||
|
// Date
|
||||||
|
ExifSubIFDDirectory exifDir = metadata.getDirectory(ExifSubIFDDirectory.class);
|
||||||
|
if(exifDir != null) {
|
||||||
|
Date date = exifDir.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
|
||||||
|
|
||||||
|
if(date != null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID(), MODULE_NAME, "", date.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GPS Stuff
|
||||||
|
GpsDirectory gpsDir = metadata.getDirectory(GpsDirectory.class);
|
||||||
|
if(gpsDir != null) {
|
||||||
|
String latitude = gpsDir.getString(GpsDirectory.TAG_GPS_LATITUDE);
|
||||||
|
String latRef = gpsDir.getString(GpsDirectory.TAG_GPS_LATITUDE_REF);
|
||||||
|
String longitude = gpsDir.getString(GpsDirectory.TAG_GPS_LONGITUDE);
|
||||||
|
String longRef = gpsDir.getString(GpsDirectory.TAG_GPS_LONGITUDE_REF);
|
||||||
|
String altitude = gpsDir.getString(GpsDirectory.TAG_GPS_ALTITUDE);
|
||||||
|
|
||||||
|
if(latitude!= null && latRef!=null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID(), MODULE_NAME, "", latitude + " " + latRef));
|
||||||
|
} if(longitude!=null && longRef!=null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID(), MODULE_NAME, "", longitude + " " + longRef));
|
||||||
|
} if(altitude!=null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID(), MODULE_NAME, "", altitude));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Device info
|
||||||
|
ExifIFD0Directory devDir = metadata.getDirectory(ExifIFD0Directory.class);
|
||||||
|
if(devDir != null) {
|
||||||
|
String model = devDir.getString(ExifIFD0Directory.TAG_MODEL);
|
||||||
|
String make = devDir.getString(ExifIFD0Directory.TAG_MAKE);
|
||||||
|
|
||||||
|
if(model!=null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL.getTypeID(), MODULE_NAME, "", model));
|
||||||
|
} if(make!=null) {
|
||||||
|
attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE.getTypeID(), MODULE_NAME, "", make));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the attributes, if there are any, to a new artifact
|
||||||
|
if(!attributes.isEmpty()) {
|
||||||
|
BlackboardArtifact bba = f.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO);
|
||||||
|
bba.addAttributes(attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return IngestServiceAbstractFile.ProcessResult.OK;
|
||||||
|
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
Logger.getLogger(ExifParserFileIngestService.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch (ImageProcessingException ex) {
|
||||||
|
System.out.println("ImageProcessingException: " + ex);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
logger.log(Level.WARNING, "IOException when parsing image file.", ex);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if(in!=null) { in.close(); }
|
||||||
|
if(bin!=null) { bin.close(); }
|
||||||
|
} catch (IOException ex) {
|
||||||
|
logger.log(Level.WARNING, "Failed to close InputStream.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we got here, there was an error
|
||||||
|
return IngestServiceAbstractFile.ProcessResult.ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean parsableFormat(FsContent f) {
|
||||||
|
// Get the name, extension
|
||||||
|
String name = f.getName();
|
||||||
|
int dotIndex = name.lastIndexOf(".");
|
||||||
|
if (dotIndex == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String ext = name.substring(dotIndex).toLowerCase();
|
||||||
|
if(ext.equals(".jpeg") || ext.equals(".jpg")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void complete() {
|
||||||
|
logger.log(Level.INFO, "completed exif parsing " + this.toString());
|
||||||
|
|
||||||
|
final IngestMessage msg = IngestMessage.createMessage(++messageId, MessageType.INFO, this, "Complete");
|
||||||
|
managerProxy.postMessage(msg);
|
||||||
|
|
||||||
|
//service specific cleanup due to completion here
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Exif Image Parser";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Ingests all image files and retrieves their metadata.";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(IngestManagerProxy managerProxy) {
|
||||||
|
logger.log(Level.INFO, "init() " + this.toString());
|
||||||
|
this.managerProxy = managerProxy;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
logger.log(Level.INFO, "stop()");
|
||||||
|
managerProxy.postMessage(IngestMessage.createMessage(++messageId, MessageType.INFO, this, "Stopped"));
|
||||||
|
|
||||||
|
//service specific cleanup due to interruption here
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IngestServiceAbstract.ServiceType getType() {
|
||||||
|
return IngestServiceAbstract.ServiceType.AbstractFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasSimpleConfiguration() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasAdvancedConfiguration() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public javax.swing.JPanel getSimpleConfiguration() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public javax.swing.JPanel getAdvancedConfiguration() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasBackgroundJobsRunning() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveAdvancedConfiguration() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveSimpleConfiguration() {
|
||||||
|
}
|
||||||
|
}
|
11
ExifParser/src/org/sleuthkit/autopsy/exifparser/layer.xml
Normal file
11
ExifParser/src/org/sleuthkit/autopsy/exifparser/layer.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
|
||||||
|
<filesystem>
|
||||||
|
<folder name="Services">
|
||||||
|
<file name="org-sleuthkit-autopsy-exifparser-ExifParserFileIngestService.instance">
|
||||||
|
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.ingest.IngestServiceAbstractFile"/>
|
||||||
|
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.exifparser.ExifParserFileIngestService.getDefault"/>
|
||||||
|
<attr name="position" intvalue="110"/>
|
||||||
|
</file>
|
||||||
|
</folder>
|
||||||
|
</filesystem>
|
@ -30,7 +30,8 @@ modules=\
|
|||||||
${project.org.sleuthkit.autopsy.recentactivity}:\
|
${project.org.sleuthkit.autopsy.recentactivity}:\
|
||||||
${project.org.sleuthkit.autopsy.report}:\
|
${project.org.sleuthkit.autopsy.report}:\
|
||||||
${project.org.sleuthkit.autopsy.testing}:\
|
${project.org.sleuthkit.autopsy.testing}:\
|
||||||
${project.org.sleuthkit.autopsy.thunderbirdparser}
|
${project.org.sleuthkit.autopsy.thunderbirdparser}:\
|
||||||
|
${project.org.sleuthkit.autopsy.exifparser}
|
||||||
project.org.sleuthkit.autopsy.casemodule=Case
|
project.org.sleuthkit.autopsy.casemodule=Case
|
||||||
project.org.sleuthkit.autopsy.corecomponentinterfaces=CoreComponentInterfaces
|
project.org.sleuthkit.autopsy.corecomponentinterfaces=CoreComponentInterfaces
|
||||||
project.org.sleuthkit.autopsy.corecomponents=CoreComponents
|
project.org.sleuthkit.autopsy.corecomponents=CoreComponents
|
||||||
@ -45,5 +46,5 @@ project.org.sleuthkit.autopsy.datamodel=DataModel
|
|||||||
project.org.sleuthkit.autopsy.recentactivity=RecentActivity
|
project.org.sleuthkit.autopsy.recentactivity=RecentActivity
|
||||||
project.org.sleuthkit.autopsy.report=Report
|
project.org.sleuthkit.autopsy.report=Report
|
||||||
project.org.sleuthkit.autopsy.testing=Testing
|
project.org.sleuthkit.autopsy.testing=Testing
|
||||||
|
|
||||||
project.org.sleuthkit.autopsy.thunderbirdparser=thunderbirdparser
|
project.org.sleuthkit.autopsy.thunderbirdparser=thunderbirdparser
|
||||||
|
project.org.sleuthkit.autopsy.exifparser=exifparser
|
||||||
|
Loading…
x
Reference in New Issue
Block a user