diff --git a/.gitignore b/.gitignore index 6d28ff7d057ff60446874ffb1562d52be9f318b9..d5205772823da74734ee01b901dcf31baab67b41 100755 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,12 @@ /bindings/java/lib/ /bindings/java/build/ /bindings/java/dist +/bindings/java/test/output +/bindings/java/test/input +/bindings/java/nbproject/genfiles.properties +/bindings/java/nbproject/nbjdk.properties +/bindings/java/nbproject/jdk.xml +/bindings/java/nbproject/nbjdk.xml # Windows build folders /win32/Debug_NoLibs/ diff --git a/bindings/java/build.xml b/bindings/java/build.xml index 05ebf157e773f68a4c6a88df1e651652d95f24f6..68f7fadde6ecc19d34f32b883074cc425fc8ee74 100755 --- a/bindings/java/build.xml +++ b/bindings/java/build.xml @@ -7,7 +7,12 @@ <!-- some dlls come from LIBEWF_HOME --> <property environment="env"/> <condition property="ewfFound"> - <isset property="env.LIBEWF_HOME"/> + <and> + <isset property="env.LIBEWF_HOME"/> + <not> + <os family="mac"/> + </not> + </and> </condition> <!-- set global properties for this build --> @@ -16,7 +21,10 @@ <property name="dist" location="dist"/> <property name="lib" location="lib"/> <property name="test" location="test"/> - <property name="test-standards" location="teststandards"/> + <property name="test-standards" location="test/output/gold"/> + <property name="test-results" location="test/output/results"/> + <property name="test-input" location="test/input"/> + <property name="test-types" location="test/org/sleuthkit/datamodel"/> <property name="dlls" value="${env.LIBEWF_HOME}/msvscpp/zlib;${env.LIBEWF_HOME}/msvscpp/Release;../../win32/Release"/> <path id="libraries"> @@ -31,7 +39,9 @@ <mkdir dir="${build}"/> <mkdir dir="${dist}"/> <mkdir dir="${lib}"/> + <mkdir dir="${test-input}"/> <mkdir dir="${test-standards}"/> + <mkdir dir="${test-results}"/> </target> <property name="ivy.install.version" value="2.1.0-rc2" /> @@ -71,27 +81,35 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" /> <target name="compile-test" depends="compile" description="compile the tests" > - <javac debug="on" srcdir="${test}" destdir="${build}"> + <javac debug="on" srcdir="${test}" destdir="${build}" includeantruntime="false"> <classpath refid="libraries"/> </javac> </target> - <target name="create-standards" depends="compile-test" - description="create gold standards to run the datamodel tests against" > + <target name="test-create-standards" + description="Traverses the Images stored in the path represented by test-input variable and creates then stores them to the path represented by the test-standards variable, run test-download-imgs at least once before this." + depends="compile-test" > <fail unless="ewfFound" message="LIBEWF_HOME must be set as an environment variable."/> - <java classname="org.sleuthkit.datamodel.DiffUtil" classpathref="libraries" fork="true" failonerror="true"> + <java classname="org.sleuthkit.datamodel.DataModelTestSuite" classpathref="libraries" fork="true" failonerror="true"> <sysproperty key="java.library.path" value="${dlls}"/> + <sysproperty key="gold" value="${test-standards}"/> + <sysproperty key="inpt" value="${test-input}"/> + <sysproperty key="types" value="${test-types}"/> </java> </target> - <target name="test" depends="compile-test" - description="run the tests" > + <target name="test" + description="Traverses the Images stored in the path represented by test-input variable, creates results files stored in the path represented by test-results, and compares them to the standards stored in the path represented by the test-standards variable, always run test-create-standards at least once before before running test." + depends="compile-test" > <fail unless="ewfFound" message="LIBEWF_HOME must be set as an environment variable."/> <junit fork="on" haltonfailure="yes" dir="."> <sysproperty key="java.library.path" value="${dlls}"/> + <sysproperty key="rslt" value="${test-results}"/> + <sysproperty key="gold" value="${test-standards}"/> + <sysproperty key="inpt" value="${test-input}"/> <classpath refid="libraries" /> <formatter type="plain" usefile="false" /> - <test name="org.sleuthkit.datamodel.DiffTest" /> + <test name="org.sleuthkit.datamodel.DataModelTestSuite" /> </junit> </target> @@ -127,5 +145,9 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" /> <mkdir dir="javadoc"/> <javadoc sourcepath="src" destdir="javadoc" overview="src/overview.html" /> </target> - + <target name="test-download-imgs" description="Get test images and store them in the path represented by the test-input variable."> + <mkdir dir="${test-input}" /> + <get src="http://digitalcorpora.org/corp/nps/drives/nps-2009-canon2/nps-2009-canon2-gen5.raw" dest="${test-input}"/> + <get src="http://digitalcorpora.org/corp/nps/drives/nps-2009-ntfs1/ntfs1-gen2.raw" dest="${test-input}"/> + </target> </project> diff --git a/bindings/java/nbproject/project.xml b/bindings/java/nbproject/project.xml index 2a778c026c9bf6649f4d779c2cdec1d15b322d53..7be1d26b299adbb2688a9aaf79be66d1e3f14061 100755 --- a/bindings/java/nbproject/project.xml +++ b/bindings/java/nbproject/project.xml @@ -1,155 +1,163 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://www.netbeans.org/ns/project/1"> - <type>org.netbeans.modules.ant.freeform</type> - <configuration> - <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1"> - <name>DataModel</name> - </general-data> - <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2"> - <!-- Do not use Project Properties customizer when editing this file manually. --> - <name>DataModel</name> - <properties/> - <folders> - <source-folder> - <label>DataModel</label> - <location>.</location> - <encoding>windows-1252</encoding> - </source-folder> - <source-folder> - <label>src</label> - <type>java</type> - <location>src</location> - <encoding>windows-1252</encoding> - </source-folder> - <source-folder> - <label>test</label> - <type>java</type> - <location>test</location> - <encoding>windows-1252</encoding> - </source-folder> - </folders> - <ide-actions> - <action name="build"> - <target>dist</target> - </action> - <action name="clean"> - <target>clean</target> - </action> - <action name="rebuild"> - <target>clean</target> - <target>dist</target> - </action> - <action name="run.single"> - <script>nbproject/ide-file-targets.xml</script> - <target>run-selected-file-in-test</target> - <context> - <property>run.class</property> - <folder>test</folder> - <pattern>\.java$</pattern> - <format>java-name</format> - <arity> - <one-file-only/> - </arity> - </context> - </action> - <action name="compile.single"> - <script>nbproject/ide-file-targets.xml</script> - <target>compile-selected-files-in-test</target> - <context> - <property>files</property> - <folder>test</folder> - <pattern>\.java$</pattern> - <format>relative-path</format> - <arity> - <separated-files>,</separated-files> - </arity> - </context> - </action> - <action name="test"> - <target>test</target> - </action> - <action name="javadoc"> - <target>javadoc</target> - </action> - </ide-actions> - <export> - <type>folder</type> - <location>build</location> - <build-target>dist</build-target> - </export> - <export> - <type>folder</type> - <location>build</location> - <build-target>dist</build-target> - </export> - <export> - <type>folder</type> - <location>test</location> - <build-target>dist</build-target> - </export> - <view> - <items> - <source-folder style="packages"> - <label>src</label> - <location>src</location> - </source-folder> - <source-folder style="packages"> - <label>test</label> - <location>test</location> - </source-folder> - <source-file> - <location>build.xml</location> - </source-file> - </items> - <context-menu> - <ide-action name="build"/> - <ide-action name="rebuild"/> - <ide-action name="clean"/> - <ide-action name="javadoc"/> - <ide-action name="test"/> - </context-menu> - </view> - <subprojects/> - </general-data> - <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/3"> - <compilation-unit> - <package-root>src</package-root> - <classpath mode="compile">lib;lib/diffutils-1.2.1.jar;lib/sqlite-jdbc-3.7.8-SNAPSHOT.jar;lib/junit-4.8.2.jar</classpath> - <built-to>build</built-to> - <source-level>1.7</source-level> - </compilation-unit> - <compilation-unit> - <package-root>test</package-root> - <unit-tests/> - <classpath mode="compile">build;lib/diffutils-1.2.1.jar;lib/diffutils-1.2.1-javadoc.jar;lib/diffutils-1.2.1-sources.jar;lib/junit-4.8.2.jar</classpath> - <built-to>build</built-to> - <built-to>test</built-to> - <source-level>1.7</source-level> - </compilation-unit> - </java-data> - <preferences xmlns="http://www.netbeans.org/ns/auxiliary-configuration-preferences/1"> - <module name="org-netbeans-modules-html-editor-lib"/> - <module name="org-netbeans-modules-editor-indent"> - <node name="CodeStyle"> - <property name="usedProfile" value="project"/> - <node name="project"> - <property name="spaces-per-tab" value="4"/> - <property name="tab-size" value="4"/> - <property name="indent-shift-width" value="4"/> - <property name="expand-tabs" value="false"/> - <property name="text-limit-width" value="80"/> - <property name="text-line-wrap" value="none"/> - </node> - </node> - <node name="text"> - <node name="x-java"> - <node name="CodeStyle"> - <node name="project"/> - </node> - </node> - </node> - </module> - <module name="org-netbeans-modules-projectimport-eclipse-core"/> - </preferences> - </configuration> -</project> +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://www.netbeans.org/ns/project/1"> + <type>org.netbeans.modules.ant.freeform</type> + <configuration> + <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1"> + <name>DataModel</name> + </general-data> + <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2"> + <!-- Do not use Project Properties customizer when editing this file manually. --> + <name>DataModel</name> + <properties/> + <folders> + <source-folder> + <label>DataModel</label> + <location>.</location> + <encoding>windows-1252</encoding> + </source-folder> + <source-folder> + <label>src</label> + <type>java</type> + <location>src</location> + <encoding>windows-1252</encoding> + </source-folder> + <source-folder> + <label>test</label> + <type>java</type> + <location>test</location> + <encoding>windows-1252</encoding> + </source-folder> + </folders> + <ide-actions> + <action name="build"> + <script>nbproject/nbjdk.xml</script> + <target>dist</target> + </action> + <action name="clean"> + <script>nbproject/nbjdk.xml</script> + <target>clean</target> + </action> + <action name="rebuild"> + <script>nbproject/nbjdk.xml</script> + <target>clean</target> + <target>dist</target> + </action> + <action name="run.single"> + <script>nbproject/nbjdk.xml</script> + <target>run-selected-file-in-test</target> + <context> + <property>run.class</property> + <folder>test</folder> + <pattern>\.java$</pattern> + <format>java-name</format> + <arity> + <one-file-only/> + </arity> + </context> + </action> + <action name="compile.single"> + <script>nbproject/nbjdk.xml</script> + <target>compile-selected-files-in-test</target> + <context> + <property>files</property> + <folder>test</folder> + <pattern>\.java$</pattern> + <format>relative-path</format> + <arity> + <separated-files>,</separated-files> + </arity> + </context> + </action> + <action name="test"> + <script>nbproject/nbjdk.xml</script> + <target>test</target> + </action> + <action name="javadoc"> + <script>nbproject/nbjdk.xml</script> + <target>javadoc</target> + </action> + </ide-actions> + <export> + <type>folder</type> + <location>build</location> + <script>nbproject/nbjdk.xml</script> + <build-target>dist</build-target> + </export> + <export> + <type>folder</type> + <location>build</location> + <script>nbproject/nbjdk.xml</script> + <build-target>dist</build-target> + </export> + <export> + <type>folder</type> + <location>test</location> + <script>nbproject/nbjdk.xml</script> + <build-target>dist</build-target> + </export> + <view> + <items> + <source-folder style="packages"> + <label>src</label> + <location>src</location> + </source-folder> + <source-folder style="packages"> + <label>test</label> + <location>test</location> + </source-folder> + <source-file> + <location>build.xml</location> + </source-file> + </items> + <context-menu> + <ide-action name="build"/> + <ide-action name="rebuild"/> + <ide-action name="clean"/> + <ide-action name="javadoc"/> + <ide-action name="test"/> + </context-menu> + </view> + <subprojects/> + </general-data> + <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/3"> + <compilation-unit> + <package-root>src</package-root> + <classpath mode="compile">lib;lib/diffutils-1.2.1.jar;lib/sqlite-jdbc-3.7.8-SNAPSHOT.jar;lib/junit-4.8.2.jar</classpath> + <built-to>build</built-to> + <source-level>1.6</source-level> + </compilation-unit> + <compilation-unit> + <package-root>test</package-root> + <unit-tests/> + <classpath mode="compile">build;lib/diffutils-1.2.1.jar;lib/diffutils-1.2.1-javadoc.jar;lib/diffutils-1.2.1-sources.jar;lib/junit-4.8.2.jar</classpath> + <built-to>build</built-to> + <built-to>test</built-to> + <source-level>1.6</source-level> + </compilation-unit> + </java-data> + <preferences xmlns="http://www.netbeans.org/ns/auxiliary-configuration-preferences/1"> + <module name="org-netbeans-modules-html-editor-lib"/> + <module name="org-netbeans-modules-editor-indent"> + <node name="CodeStyle"> + <property name="usedProfile" value="project"/> + <node name="project"> + <property name="spaces-per-tab" value="4"/> + <property name="tab-size" value="4"/> + <property name="indent-shift-width" value="4"/> + <property name="expand-tabs" value="false"/> + <property name="text-limit-width" value="80"/> + <property name="text-line-wrap" value="none"/> + </node> + </node> + <node name="text"> + <node name="x-java"> + <node name="CodeStyle"> + <node name="project"/> + </node> + </node> + </node> + </module> + <module name="org-netbeans-modules-projectimport-eclipse-core"/> + </preferences> + </configuration> +</project> diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java index a0870ca3519bd1aa511df78d23c7e56c6f24dd55..f3383224e5c26c29db88cfaf17b011c48725d8dc 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java @@ -19,6 +19,8 @@ package org.sleuthkit.datamodel; import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.SleuthkitCase.ObjectInfo; @@ -29,14 +31,12 @@ public abstract class AbstractContent implements Content { public final static long UNKNOWN_ID = -1; - private SleuthkitCase db; private long objId; private String name; private Content parent; private String uniquePath; protected long parentId; - protected AbstractContent(SleuthkitCase db, long obj_id, String name) { this.db = db; @@ -195,4 +195,26 @@ public long getArtifactsCount(ARTIFACT_TYPE type) throws TskCoreException { public long getAllArtifactsCount() throws TskCoreException { return db.getBlackboardArtifactsCount(objId); } + + @Override + public String toString() { + return toString(true); + } + + public String toString(boolean preserveState){ + if (preserveState) { + return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "parentId " + parentId + "\t" + "uniquePath " + uniquePath + "]\t"; + } else { + try { + if (getParent() != null) { + return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "getUniquePath " + getUniquePath() + "\t" + "getParent " + getParent().getId() + "]\t"; + } else { + return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "uniquePath " + getUniquePath() + "\t" + "parentId " + parentId + "]\t"; + } + } catch (TskCoreException ex) { + Logger.getLogger(AbstractContent.class.getName()).log(Level.SEVERE, "Could not find Parent", ex); + return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "parentId " + parentId + "\t" + "uniquePath " + uniquePath + "]\t"; + } + } + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java index ae8a8e11754d360d957526108d99a4da9d47fa6c..d08769acbf0c2b57fa365db97b6a3394cd16c749 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.StringTokenizer; /** * Common fields methods for objects stored in tsk_files table @@ -138,5 +137,8 @@ public List<AbstractFile> listFiles() throws TskCoreException { } return files; } - + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "AbstractFile [\t" + "type " + type + "\t" + "isDir " + isDir() + "\t" + "isFile " + isFile() + "\t" + "isRoot " + isRoot() + "\t" + "isVirtual\t" + isVirtual() + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/Directory.java b/bindings/java/src/org/sleuthkit/datamodel/Directory.java index 1c8a2485b7b12cc4bc006d83cefebe6f4e31c18d..03c8bf29273117b5ae357df6fa554aa06ef068a9 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/Directory.java +++ b/bindings/java/src/org/sleuthkit/datamodel/Directory.java @@ -79,4 +79,9 @@ public boolean isDir() { public boolean isFile() { return false; } + + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "Directory [\t" + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/File.java b/bindings/java/src/org/sleuthkit/datamodel/File.java index f2b6b71c4a35ec1f1f497de6c6f4e25d9bd737a8..356594edeb26e705972cece18c96cf80f6b2faf1 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/File.java +++ b/bindings/java/src/org/sleuthkit/datamodel/File.java @@ -81,4 +81,8 @@ public boolean isDir() { public boolean isFile() { return true; } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "File [\t" + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java index 22983e5d2d7bff5938b2bcbf1ccf836f25f766dc..b370a6baf8daa9347ea90c937db14edec59f30f9 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java +++ b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java @@ -198,4 +198,9 @@ public List<Long> getChildrenIds() throws TskCoreException { public Image getImage() throws TskCoreException { return getParent().getImage(); } + + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "FileSystem [\t" + " blockCount " + blockCount + "\t" + "blockSize " + blockSize + "\t" + "firstInum " + firstInum + "\t" + "fsType " + fsType + "\t" + "imgOffset " + imgOffset + "\t" + "lastInum " + lastInum + "\t" + "rootInum " + rootInum + "\t" + "]"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java index c12efebca0a0b7cc307979fb9ca77b6ef4dd5878..8a670a89f45c785a3a8f13b762363df9ea1eda9d 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java +++ b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java @@ -615,4 +615,8 @@ public static long timeToEpoch(String time) { return epoch; } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "FsContent [\t" + "\tcrtime " + crtime + "\t" + "mtime " + mtime + "\t" + "atime " + atime + "\t" + "attrId " + attrId + "\t" + "dirFlag " + dirFlag + "\t" + "dirType " + dirType + "\t" + "fsObjId " + fsObjId + "\t" + "gid " + gid + "\t" + "metaAddr " + metaAddr + "\t" + "metaFlags " + metaFlags + "\t" + "metaType " + metaType + "\t" + "modes " + modes + "\t" + "parentPath " + parentPath + "\t" + "size " + size + "\t" + "uid " + uid + "\t" + "uniquePath " + uniquePath + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/Image.java b/bindings/java/src/org/sleuthkit/datamodel/Image.java index b0dcdcbdaf4c6adf7bbc91f22fe5c5954024b068..387f5ce829a334dc321049d5e95d070f82848d11 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/Image.java +++ b/bindings/java/src/org/sleuthkit/datamodel/Image.java @@ -19,6 +19,7 @@ package org.sleuthkit.datamodel; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -303,4 +304,8 @@ public List<Content> getChildren() throws TskCoreException { public List<Long> getChildrenIds() throws TskCoreException { return getSleuthkitCase().getImageChildrenIds(this); } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "Image [\t" + "\t" + "paths " + Arrays.toString(paths) + "\t" + "size " + size + "\t" + "ssize " + ssize + "\t" + "timezone " + timezone + "\t" + "type " + type + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java index cbb4a22ec14b6a8bb38d2be05c8f1e0dbd57cb3b..ca7adf4dc446804fe1f7db5d8af9681815dfc01e 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java @@ -189,4 +189,8 @@ public boolean isVirtual() { public boolean isRoot() { return false; } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "LayoutFile [\t" + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index b96573df9bebaf17474d118008825842573a27ca..1ef1cb65e2cb5190b77bdd9b33610a9fd34c78cf 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -695,12 +695,10 @@ private static String timezoneLongToShort(String timezone) { } String result = ""; - TimeZone zone = TimeZone.getTimeZone(timezone); int offset = zone.getRawOffset() / 1000; int hour = offset / 3600; int min = (offset % 3600) / 60; - DateFormat dfm = new SimpleDateFormat("z"); dfm.setTimeZone(zone); boolean hasDaylight = zone.useDaylightTime(); diff --git a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java index d847096932998053a2cf16c311f3614fcca8733d..c0249535d3aadc06165a6b498f5b9b9d4305925f 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java +++ b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java @@ -137,4 +137,8 @@ public Image getImage() throws TskCoreException { public boolean isVirtual() { return true; } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "VirtualDirectory [\t" + "\tdirFlags " + dirFlags + "\t" + "dirType " + dirType + "\t" + "metaFlags " + metaFlags + "\t" + "metaType " + metaType + "\t" + "parent_path " + parent_path + "\t" + "size " + size + "]\t"; + } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/Volume.java b/bindings/java/src/org/sleuthkit/datamodel/Volume.java index 31a6d681ae419948eeb6f0223634ed2566fe2a48..19dc97d2d020dd886c4f3ea714768f74656cd7f4 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/Volume.java +++ b/bindings/java/src/org/sleuthkit/datamodel/Volume.java @@ -258,4 +258,10 @@ public List<FileSystem> getFileSystems() throws TskCoreException { return fileSystems; } + + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "Volume [\t" + "addr " + addr + "\t" + "desc " + desc + "\t" + "flags " + flags + "\t" + "length " + length + "\t" + "start " + start + "]\t"; + } + } diff --git a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java index 71ff78526e2d9db2bf3d8981e731794eb1ae5fd7..9f48376ded3d88d8ed326f26dfdc8b4372e24403 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java +++ b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java @@ -154,4 +154,8 @@ public List<Volume> getVolumes() throws TskCoreException { } return volumes; } + @Override + public String toString(boolean preserveState){ + return super.toString(preserveState) + "VolumeSystem [\t" + "blockSize " + blockSize + "\t" + "imgOffset " + imgOffset + "\t" + "type " + type + "]\t"; + } } diff --git a/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2bcdeef88dc6eb51a544fa7662f2e06a70e69b97 --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java @@ -0,0 +1,110 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; +import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** + * + * Verifies that getParent works as intended. + */ +@RunWith(Parameterized.class) +public class BottomUpTest { + + static final String BU = "_BU"; + private List<String> imagePaths; + + public BottomUpTest(List<String> imagePaths) { + this.imagePaths = imagePaths; + } + + /** + * Get the sets of filenames for each test image, they should be located in + * the folder specified by the build.xml + * + * @return A Collection of one-element Object arrays, where that one element + * is a List<String> containing the image file paths (the type is weird + * because that's what JUnit wants for parameters). + */ + @Parameterized.Parameters + public static Collection<Object[]> testImageData() { + Collection<Object[]> data = new ArrayList<Object[]>(); + + for (Object imagePaths : DataModelTestSuite.getImagePaths()) { + data.add(new Object[]{imagePaths}); + } + return data; + } + + /** + * Runs a bottom up traversal of the image, starting at each leaf and going + * until it reaches the top + */ + @Test + public void testBottomUpDiff() { + String title = DataModelTestSuite.getImgName(imagePaths.get(0)); + String exFile = DataModelTestSuite.buildPath(DataModelTestSuite.getRsltPath(), title, BU, ".txt"); + try { + java.io.File dbFile = new java.io.File(DataModelTestSuite.getRsltPath()); + String tempDirPath = dbFile.getAbsolutePath(); + String dbPath = DataModelTestSuite.buildPath(tempDirPath, title, BU, ".db"); + dbFile.delete(); + SleuthkitCase sk = SleuthkitCase.newCase(dbPath); + String timezone = ""; + title = title + DataModelTestSuite.LVS + ".txt"; + SleuthkitJNI.CaseDbHandle.AddImageProcess process = sk.makeAddImageProcess(timezone, true, false); + try { + process.run(imagePaths.toArray(new String[imagePaths.size()])); + } catch (TskDataException ex) { + DataModelTestSuite.writeExceptions(exFile, ex); + } + process.commit(); + java.io.File lvs = new java.io.File(dbFile.getAbsolutePath() + java.io.File.separator + title); + Scanner climber; + climber = new Scanner(lvs); + while (climber.hasNextLine()) { + String cliNL = climber.nextLine(); + cliNL = cliNL.substring(1); + String[] ids = cliNL.split("[\\],]\\s?+"); + Content c = sk.getContentById(Integer.parseInt(ids[0])); + for (int x = 0; x < ids.length; x++) { + assertEquals("Got ID " + c.getId() + " should have gotten ID " + ids[x], ids[x].equals(((Long) c.getId()).toString()), true); + c = c.getParent(); + } + } + } catch (NumberFormatException ex) { + System.out.println(ex.toString()); + fail("Failed to run BottomUp test"); + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(exFile, ex); + } catch (FileNotFoundException ex) { + DataModelTestSuite.writeExceptions(exFile, ex); + } + } +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java new file mode 100644 index 0000000000000000000000000000000000000000..ddf469deaf9f5db4ff9bc81628dcb4d2e1669cdc --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java @@ -0,0 +1,138 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** + * + * Compares the Java test output to the C++ test output + */ +@RunWith(Parameterized.class) +public class CPPtoJavaCompare extends ImgTraverser { + + private static final Logger logg = Logger.getLogger(CPPtoJavaCompare.class.getName()); + + public CPPtoJavaCompare(List<String> imagePaths) { + this.imagePaths = imagePaths; + } + + /** + * Get the sets of filenames for each test image + * + * @return A Collection of one-element Object arrays, where that one element + * is a List<String> containing the image file paths (the type is weird + * because that's what JUnit wants for parameters). + */ + @Parameterized.Parameters + public static Collection<Object[]> testImageData() { + Collection<Object[]> data = new ArrayList<Object[]>(); + + for (Object imagePaths : DataModelTestSuite.getImagePaths()) { + data.add(new Object[]{imagePaths}); + } + return data; + } + + /** + * Runs the test + */ + @Test + public void CPPtoJavaCompare() { + try { + List<Boolean> test = basicTest(); + assertEquals("Generated results (" + oldStandardPath + ") differ with gold standard (" + testStandardPath + ") .", test.get(0), true); + } catch (Exception ex) { + fail("Couldn't open gold standard file."); + } + } + + /** + * Extends basicTest to compare the sorted files and not the output files + */ + @Override + public List<Boolean> basicTest() { + super.basicTest(); + oldStandardPath = DataModelTestSuite.sortedFlPth(oldStandardPath); + testStandardPath = DataModelTestSuite.sortedFlPth(testStandardPath); + List<Boolean> ret = new ArrayList<Boolean>(1); + ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath)); + return ret; + } + + /** + * Traverses through an image and generates a TSK gettimes like + * representation + * + * @param sk the sleuthkit case used for the traversal + * @param path the location of the output file + * @return the file writer to be closed by testStandard + */ + @Override + public FileWriter traverse(SleuthkitCase sk, String path) { + FileWriter reslt; + try { + reslt = new FileWriter(path); + try { + tskTraverse(sk.getRootObjects(), reslt); + return reslt; + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(testStandardPath, ex); + } + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + } + return null; + } + + /** + * Traverses through an image and generates a TSK gettimes like + * representation + * + * @param lc the list of content to be traversed + * @param reslt the filewriter to append output to + */ + private void tskTraverse(List<Content> lc, Appendable reslt) { + for (Content c : lc) { + try { + if (c instanceof FsContent && !c.getUniquePath().endsWith(".") && !c.getUniquePath().endsWith("/")) { + try { + reslt.append(DataModelTestSuite.getFsCData((FsContent) c)); + reslt.append("\n"); + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + } + } + tskTraverse(c.getChildren(), reslt); + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(testStandardPath, ex); + } + } + } +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java b/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java new file mode 100644 index 0000000000000000000000000000000000000000..ae76095cb8d3631da4b32b4fd0016aad9d444ff0 --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java @@ -0,0 +1,82 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** + * + * Ensures that a sequential traversal of a given image produces the same result + * as a Top Down depth first traversal. + */ +@RunWith(Parameterized.class) +public class CrossCompare { + + private List<String> imagePaths; + private String Seq, TD; + + public CrossCompare(List<String> imagePaths, String Seq, String TD) { + this.imagePaths = imagePaths; + this.Seq = Seq; + this.TD = TD; + } + + /** + * Get the sets of filenames for each test image, they should be located in + * the folder specified by the build.xml + * + * @return A Collection of one-element Object arrays, where that one element + * is a List<String> containing the image file paths (the type is weird + * because that's what JUnit wants for parameters). + */ + @Parameterized.Parameters + public static Collection<Object[]> testImageData() { + Collection<Object[]> data = new ArrayList<Object[]>(); + + for (Object imagePaths : DataModelTestSuite.getImagePaths()) { + data.add(new Object[]{imagePaths, SequentialTraversal.class.getSimpleName(), TopDownTraversal.class.getSimpleName()}); + } + return data; + } + + /** + * Compares the sorted results of the different traversals against each + * other + */ + @Test + public void CrossCompare() { + try { + String title = DataModelTestSuite.getImgName(imagePaths.get(0)); + java.io.File testFolder = new java.io.File(DataModelTestSuite.getRsltPath()); + java.io.File testStandard1 = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, Seq, "_sorted.txt")); + java.io.File testStandard2 = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, TD, "_sorted.txt")); + String testStandardPath1 = testStandard1.getPath(); + String testStandardPath2 = testStandard2.getPath(); + assertEquals("Generated results (" + testStandardPath1 + ") differ with gold standard (" + testStandardPath2 + ") .", DataModelTestSuite.comparecontent(testStandardPath1, testStandardPath2), true); + } catch (Exception ex) { + fail("Couldn't open gold standard file."); + } + } +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java new file mode 100644 index 0000000000000000000000000000000000000000..c18d8953b7fe2814840366537d913967dde552c8 --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java @@ -0,0 +1,534 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileFilter; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * + * Runs all regression tests and contains utility methods for the tests + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({org.sleuthkit.datamodel.TopDownTraversal.class, org.sleuthkit.datamodel.SequentialTraversal.class, org.sleuthkit.datamodel.CrossCompare.class, org.sleuthkit.datamodel.BottomUpTest.class, org.sleuthkit.datamodel.CPPtoJavaCompare.class}) +public class DataModelTestSuite { + + static final String TEST_IMAGE_DIR_NAME = "test" + java.io.File.separator + "Input"; + static final String INPT = "inpt"; + static final String GOLD = "gold"; + static final String RSLT = "rslt"; + static final String SEQ = "_Seq"; + static final String TD = "_TD"; + static final String LVS = "_Leaves"; + static final String EX = "_Exceptions"; + static final String TST = "types"; + static final int READ_BUFFER_SIZE = 8192; + static final String HASH_ALGORITHM = "MD5"; + private static final Logger logg = Logger.getLogger(DataModelTestSuite.class.getName()); + + /** + * Empties the results directory + * + * @throws Exception + */ + @BeforeClass + public static void setUpClass() throws Exception { + java.io.File results = new java.io.File(getRsltPath()); + for (java.io.File del : results.listFiles()) { + del.delete(); + } + } + + /** + * Generates a list of the traversals to be used for standard creations + * + * @return + */ + public static List<ImgTraverser> getTests() { + List<ImgTraverser> ret = new ArrayList<ImgTraverser>(); + ret.add(new SequentialTraversal(null)); + ret.add(new TopDownTraversal(null)); + return ret; + } + + /** + * Creates the Sleuth Kit database for an image, then generates a string + * representation of the given traversal type of the resulting database to + * use as a standard for comparison, and saves the the standard to a file. + * + * @param standardPath The path to save the standard file to (will be + * overwritten if it already exists) + * @param tempDirPath An existing directory to create the test database in + * @param imagePaths The path(s) to the image file(s) + * @param type The type of traversal to run. + * @param exFile The exceptions file, will be used for logging purposes + */ + public static void createStandard(String standardPath, String tempDirPath, List<String> imagePaths, ImgTraverser type) { + java.io.File standardFile = new java.io.File(standardPath); + String exFile = standardFile.getAbsolutePath().replace(".txt", EX + ".txt"); + try { + String firstImageFile = getImgName(imagePaths.get(0)); + String dbPath = buildPath(tempDirPath, firstImageFile, type.getClass().getSimpleName(), ".db"); + java.io.File dbFile = new java.io.File(dbPath); + standardFile.createNewFile(); + dbFile.delete(); + SleuthkitCase sk = SleuthkitCase.newCase(dbPath); + String timezone = ""; + SleuthkitJNI.CaseDbHandle.AddImageProcess process = sk.makeAddImageProcess(timezone, true, false); + java.io.File xfile = new java.io.File(exFile); + xfile.createNewFile(); + try { + process.run(imagePaths.toArray(new String[imagePaths.size()])); + } catch (TskDataException ex) { + writeExceptions(standardFile.getAbsolutePath(), ex); + } + process.commit(); + FileWriter standardWriter = type.traverse(sk, standardFile.getAbsolutePath()); + standardWriter.flush(); + runSort(standardFile.getAbsolutePath()); + } catch (IOException ex) { + logg.log(Level.SEVERE, "Couldn't create Standard", ex); + throw new RuntimeException(ex); + } catch (TskCoreException ex) { + writeExceptions(standardFile.getAbsolutePath(), ex); + } + } + + /** + * Gets the paths to the test image files by looking for a test image in the + * given output directory + * + * @return A list of lists of paths to image parts + */ + static List<List<String>> getImagePaths() { + + // needs to be absolute file because we're going to walk up its path + java.io.File dir = new java.io.File(System.getProperty(INPT, TEST_IMAGE_DIR_NAME)); + + FileFilter imageFilter = new FileFilter() { + @Override + public boolean accept(java.io.File f) { + return isImgFile(f.getName()); + } + }; + List<List<String>> images = new ArrayList<List<String>>(); + for (java.io.File imageSet : dir.listFiles(imageFilter)) { + ArrayList<String> imgs = new ArrayList<String>(); + imgs.add(imageSet.getAbsolutePath()); + images.add(imgs); + } + return images; + } + + /** + * Get the path for a standard corresponding to the given image path. + * + * @param imagePaths path of the image to get a standard for + * @return path to put/find the standard at + */ + static String standardPath(List<String> imagePaths, String type) { + String firstImage = getImgName(imagePaths.get(0)); + String standardPath = goldStandardPath() + java.io.File.separator + firstImage + "_" + type + ".txt"; + return standardPath; + } + + /** + * removes the files with the file name from the from the given path + * + * @param path the path to the folder where files are to be deleted + * @param filename the name of the files to be deleted + */ + public static void emptyResults(String path, String filename) { + final String filt = filename.replace(TD, "").replace(".txt", "").replace(SEQ, ""); + FileFilter imageResFilter = new FileFilter() { + @Override + public boolean accept(java.io.File f) { + return f.getName().contains(filt) & !f.getName().contains(LVS) & !f.getName().contains("Sorted"); + } + }; + java.io.File pth = new java.io.File(path); + for (java.io.File del : pth.listFiles(imageResFilter)) { + del.deleteOnExit(); + } + } + + /** + * Runs tsk_gettimes to create a standard for comparing DataModel and TSK + * output. + * + * @param standardPath The path to the file to put the tsk data in + * @param img the path to the image, is a list for compatability reasons + */ + private static void getTSKData(String standardPath, List<String> img) { + String tsk_loc; + java.io.File up = new java.io.File(System.getProperty("user.dir")); + up = up.getParentFile(); + up = up.getParentFile(); + if (System.getProperty("os.name").contains("Windows")) { + tsk_loc = up.getAbsolutePath() + "\\win32\\Release\\tsk_gettimes"; + } else { + return; + } + String[] cmd = {tsk_loc, img.get(0)}; + try { + Process p = Runtime.getRuntime().exec(cmd); + Scanner read = new Scanner(p.getInputStream()); + Scanner error1 = new Scanner(p.getErrorStream()); + FileWriter out = new FileWriter(standardPath); + while (read.hasNextLine()) { + String line = read.nextLine(); + line = line.replace(" (deleted)", ""); + line = line.replace("(null)", ""); + //removes unknown data attached to metaAddr + String[] linecontents = line.split("\\|"); + String metaaddrcon = linecontents[2]; + String mtad = metaaddrcon.split("\\-")[0]; + line = line.replace(metaaddrcon, mtad); + out.append(line); + out.flush(); + out.append("\n"); + } + runSort(standardPath); + } catch (Exception ex) { + logg.log(Level.SEVERE, "Failed to run CPP program", ex); + } + java.io.File xfile = new java.io.File(standardPath.replace(".txt", DataModelTestSuite.EX + ".txt")); + try { + xfile.createNewFile(); + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to create exceptions file", ex); + } + } + + /** + * Strips the file extension from the given string + * + * @param title the file to have its extension stripped + * @return + */ + private static String stripExtension(String title) { + return title.substring(0, title.lastIndexOf(".")); + } + + /** + * builds the path for an output file + * + * @param path the path to the directory for the file to be stored in + * @param name the name of the file + * @param type the output type of the file + * @param Ext the file extension + * @return the path for an output file + */ + public static String buildPath(String path, String name, String type, String Ext) { + return path + java.io.File.separator + name + "_" + type + Ext; + } + + /** + * Returns the name of an image from the given path + * + * @param img + * @return + */ + public static String getImgName(String img) { + String[] imgSp = img.split("\\\\"); + return stripExtension(imgSp[imgSp.length - 1]); + } + + /** + * Gets the location results are stored in. + * + * @return + */ + public static String getRsltPath() { + return System.getProperty(RSLT, "test" + java.io.File.separator + "output" + java.io.File.separator + "results"); + } + + /** + * returns the path to the sort command + * + * @return + */ + private static String getSortPath() { + if (!System.getProperty("os.name").contains("Windows")) { + return "sort"; + } else { + return "\\cygwin\\bin\\sort.exe"; + } + } + + /** + * returns the path to the diff command + * + * @return + */ + private static String getDiffPath() { + if (!System.getProperty("os.name").contains("Windows")) { + return "diff"; + } else { + return "\\cygwin\\bin\\diff.exe"; + } + } + + /** + * Writes the given exception to the given file + * + * @param filename the path of the file that exceptions are being stored for + * @param ex the exception to be written + */ + protected static void writeExceptions(String filename, Exception ex) { + filename = filename.replace(".txt", EX + ".txt"); + FileWriter exWriter; + try { + exWriter = new FileWriter(filename, true); + exWriter.append(ex.toString()); + exWriter.flush(); + exWriter.close(); + } catch (IOException ex1) { + logg.log(Level.SEVERE, "Couldn't log Exception", ex1); + } + } + + /** + * returns the gold standard path + * + * @return + */ + private static String goldStandardPath() { + return System.getProperty(GOLD, ("test" + java.io.File.separator + "output" + java.io.File.separator + "gold")); + } + + /** + * Reads the data for a given content object, used to create hashes + * + * @param c the content object to be read + * @param result the appendable to append the results to + * @param StrgFile the file path that the content is being read for + */ + public static void readContent(Content c, Appendable result, String StrgFile) { + long size = c.getSize(); + byte[] readBuffer = new byte[READ_BUFFER_SIZE]; + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + + for (long i = 0; i < size; i = i + READ_BUFFER_SIZE) { + c.read(readBuffer, i, Math.min(size - i, READ_BUFFER_SIZE)); + md5.update(readBuffer); + } + String hash = toHex(md5.digest()); + + result.append("md5=" + hash); + + } catch (NoSuchAlgorithmException ex) { + logg.log(Level.SEVERE, "Failed to generate Hash", ex); + } catch (IOException ex){ + logg.log(Level.SEVERE, "Failed to generate Hash", ex); + } catch (TskCoreException ex) { + writeExceptions(StrgFile, ex); + } + } + + /** + * Helper method for Read Content, converts a byte array to a Hexadecimal + * String + * + * @param bytes given byte array. + * @return a Hexadecimal String + */ + private static String toHex(byte[] bytes) { + StringBuilder hex = new StringBuilder(); + for (byte b : bytes) { + hex.append(String.format("%02x", b & 0xFF)); + } + return hex.toString(); + } + + /** + * gets the metadata from a datamodel file object + * + * @param fi + * @return + * @throws TskCoreException + */ + protected static String getFsCData(FsContent fi) throws TskCoreException { + String[] path = fi.getUniquePath().split("/", 3); + String name; + if (path[2].contains("vol_")) { + String[] pthget = path[2].split("_", 2); + name = pthget[pthget.length - 1]; + } else { + name = path[2]; + } + name = name.replaceAll("[^\\x20-\\x7e]", ""); + String prpnd; + if (fi.isFile()) { + prpnd = "r/"; + } else { + prpnd = "d/"; + } + if (fi.isVirtual() && !fi.isDir()) { + prpnd = "v/"; + } + return ("0|" + name + "|" + fi.metaAddr + "|" + fi.getMetaTypeAsString() + "/" + fi.getModesAsString() + "|" + fi.getUid() + "|0|" + fi.getSize() + "|" + fi.getAtime() + "|" + fi.getMtime() + "|" + fi.getCtime() + "|" + fi.getCrtime()); + } + + /** + * Calls {@link #createStandard(String, String, String[]) createStandard} + * with default arguments + * + * @param args Ignored + */ + public static void main(String[] args) { + String tempDirPath = System.getProperty("java.io.tmpdir"); + tempDirPath = tempDirPath.substring(0, tempDirPath.length() - 1); + java.io.File pth = new java.io.File(DataModelTestSuite.goldStandardPath()); + FileFilter testExFilter = new FileFilter() { + @Override + public boolean accept(java.io.File f) { + return f.getName().contains(EX); + } + }; + for (java.io.File del : pth.listFiles(testExFilter)) { + del.delete(); + } + List<ImgTraverser> tests = DataModelTestSuite.getTests(); + List<List<String>> imagePaths = DataModelTestSuite.getImagePaths(); + for (List<String> paths : imagePaths) { + for (ImgTraverser tstrn : tests) { + String standardPath = DataModelTestSuite.standardPath(paths, tstrn.getClass().getSimpleName()); + System.out.println("Creating " + tstrn.getClass().getSimpleName() + " standard for: " + paths.get(0)); + DataModelTestSuite.createStandard(standardPath, tempDirPath, paths, tstrn); + } + String standardPathCPP = DataModelTestSuite.standardPath(paths, CPPtoJavaCompare.class.getSimpleName()); + DataModelTestSuite.getTSKData(standardPathCPP, paths); + } + } + + /** + * Compares the content of two files to determine if they are equal, if they + * are it removes the file from the results folder + * + * @param original is the first file to be compared + * @param results is the second file to be compared + */ + protected static boolean comparecontent(String original, String results) { + try { + java.io.File fi1 = new java.io.File(original); + java.io.File fi2 = new java.io.File(results); + FileReader f1 = new FileReader(new java.io.File(original).getAbsolutePath()); + FileReader f2 = new FileReader(new java.io.File(results).getAbsolutePath()); + Scanner in1 = new Scanner(f1); + Scanner in2 = new Scanner(f2); + while (in1.hasNextLine() || in2.hasNextLine()) { + if ((in1.hasNextLine() ^ in2.hasNextLine()) || !(in1.nextLine().equals(in2.nextLine()))) { + in1.close(); + in2.close(); + f1.close(); + f2.close(); + DiffUtil.getDiff(fi1.getAbsolutePath(), fi2.getAbsolutePath(), original.substring(original.lastIndexOf(java.io.File.separator) + 1)); + return false; + } + } + //DataModelTestSuite.emptyResults(fi2.getParent(), fi2.getName()); + return true; + } catch (IOException ex) { + logg.log(Level.SEVERE, "Couldn't compare content", ex); + return false; + } + } + + /** + * runs sort on the given file + * + * @param inp + */ + private static void runSort(String inp) { + String outp = sortedFlPth(inp); + String cygpath = getSortPath(); + String[] cmd = {cygpath, inp, "-o", outp}; + try { + Runtime.getRuntime().exec(cmd).waitFor(); + } catch (InterruptedException ex) { + logg.log(Level.SEVERE, "Couldn't create Standard", ex); + throw new RuntimeException(ex); + } catch(IOException ex){ + logg.log(Level.SEVERE, "Couldn't create Standard", ex); + throw new RuntimeException(ex); + } + } + + /** + * Returns the name of the sorted file + * + * @param path the original name of the file + * @return + */ + protected static String sortedFlPth(String path) { + return path.replace(".txt", "_Sorted.txt"); + } + + /** + * Runs the Cygwin Diff algorithm on two files, is currently unused + * + * @param path1 is the path to the first file + * @param path2 is the path to the second file + */ + private static void runDiff(String path1, String path2) { + String diffPath = getDiffPath(); + String outputLoc = path2.replace(".txt", "_Diff.txt"); + String[] cmd = {diffPath, path1, path2}; + try { + Process p = Runtime.getRuntime().exec(cmd); + Scanner read = new Scanner(p.getInputStream()); + Scanner error1 = new Scanner(p.getErrorStream()); + FileWriter out = new FileWriter(outputLoc); + while (read.hasNextLine()) { + String line = read.nextLine(); + out.append(line); + out.flush(); + out.append("\n"); + out.flush(); + } + } catch (Exception ex) { + logg.log(Level.SEVERE, "Failed to run Diff program", ex); + } + } + + /** + * Returns whether or not a file is an image file + * + * @param name the name of the file + * @return a boolean that is true if the name ends with an image file + * extension + */ + protected static boolean isImgFile(String name) { + return name.endsWith(".001") || name.endsWith(".raw") || name.endsWith(".img") || name.endsWith(".E01") || name.endsWith(".dd"); + } +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java b/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java deleted file mode 100644 index 1d04d86a3995ea00de5eff94ae3b665a80350edd..0000000000000000000000000000000000000000 --- a/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Sleuth Kit Data Model - * - * 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.datamodel; - -import java.io.FileFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.rules.TemporaryFolder; -import static org.junit.Assert.*; - -/** - * Tests the DataModel by printing - * @author pmartel - */ -@RunWith(Parameterized.class) -public class DiffTest { - - static final String TEST_IMAGE_DIR_NAME = "testimages"; - - - @Rule - public TemporaryFolder testFolder = new TemporaryFolder(); - private List<String> imagePaths; - - - public DiffTest(List<String> imagePaths) { - this.imagePaths = imagePaths; - } - /** - * Gets the paths to the test image files by looking for a test image - * directory above the local SVN trunk/branch. - * @return A list of lists of paths to image parts - */ - static List<List<String>> getImagePaths() { - FileFilter imageDirFilter = new FileFilter() { - @Override - public boolean accept(java.io.File f) { - return f.isDirectory() && f.getName().equalsIgnoreCase(TEST_IMAGE_DIR_NAME); - } - }; - - - // needs to be absolute file because we're going to walk up its path - java.io.File dir = (new java.io.File(".")).getAbsoluteFile(); - dir = dir.getParentFile().getParentFile().getParentFile().getParentFile(); - - // image dir is either one level above trunk/ or in tags/ - if (dir.listFiles(imageDirFilter).length == 1) { - // above trunk/ - dir = dir.listFiles(imageDirFilter)[0]; - } else { - // in tags/, go up one more level - dir = dir.getParentFile().listFiles(imageDirFilter)[0]; - } - - List<List<String>> images = new ArrayList<List<String>>(); - for (java.io.File imageSet : dir.listFiles()) { - List<String> absolutePaths = new ArrayList(); - for (String filename : imageSet.list()) { - absolutePaths.add(imageSet.getAbsolutePath() + java.io.File.separator + filename); - } - - images.add(absolutePaths); - } - return images; - } - /** - * Get the sets of filenames for each test image - * @return A Collection of one-element Object arrays, where that one element - * is a List<String> containing the image file paths (the type is weird - * because that's what JUnit wants for parameters). - */ - @Parameters - public static Collection<Object[]> testImageData() { - Collection<Object[]> data = new ArrayList<Object[]>(); - - for (Object imagePaths : getImagePaths()) { - data.add(new Object[]{imagePaths}); - } - return data; - } - - /** - * Get the path for a standard corresponding to the given image path. - * @param imagePaths path of the image to get a standard for - * @return path to put/find the standard at - */ - static String standardPath(List<String> imagePaths) { - java.io.File firstImage = new java.io.File(imagePaths.get(0)); - String standardPath = "teststandards" + java.io.File.separator + firstImage.getName().split("\\.")[0] + "_standard.txt"; - return standardPath; - } - - - @Test - public void testDataModelDiff() { - try { - java.io.File testStandard = testFolder.newFile("test_standard.txt"); - - String testStandardPath = testStandard.getPath(); - String oldStandardPath = standardPath(imagePaths); - - DiffUtil.createStandard(testStandardPath, testFolder.getRoot().getPath(), imagePaths); - String diff = DiffUtil.getDiff(oldStandardPath, testStandardPath); - - assertEquals("Generated results ("+testStandardPath+") differ with gold standard ("+oldStandardPath+") .", "", diff); - } catch (IOException ex) { - fail("Couldn't open gold standard file."); - } - } -} diff --git a/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java b/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java index 6f0a7a2a284bd73101d9198c072075d5aeabf3db..a6b648bdf63726cd42f55ea0967aeaac77a0785a 100644 --- a/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java +++ b/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java @@ -27,75 +27,30 @@ import java.io.IOException; import java.util.LinkedList; import java.util.List; -import org.sleuthkit.datamodel.SleuthkitJNI.CaseDbHandle.AddImageProcess; +import java.util.logging.Level; +import java.util.logging.Logger; /** - * - * @author pmartel + * This class gets the Diff of two files. */ public class DiffUtil { /** - * Creates the Sleuth Kit database for an image, generates a string - * representation of the resulting database to use as a standard for - * comparison, and saves the the standard to a file. - * @param standardPath The path to save the standard file to (will be - * overwritten if it already exists) - * @param tempDirPath An existing directory to create the test database in - * @param imagePaths The path(s) to the image file(s) + * converts a file to a series of lines + * + * @param filename the name of the file + * @return */ - public static void createStandard(String standardPath, String tempDirPath, List<String> imagePaths) { - java.io.File standardFile = new java.io.File(standardPath); - try { - java.io.File firstImageFile = new java.io.File(imagePaths.get(0)); - java.io.File tempDir = new java.io.File(tempDirPath); - String dbPath = tempDir.getPath() + java.io.File.separator + firstImageFile.getName() + ".db"; - java.io.File dbFile = new java.io.File(dbPath); - - standardFile.createNewFile(); - FileWriter standardWriter = new FileWriter(standardFile); - ReprDataModel repr = new ReprDataModel(standardWriter); - - dbFile.delete(); - - SleuthkitCase sk = SleuthkitCase.newCase(dbPath); - - String timezone = ""; - AddImageProcess process = sk.makeAddImageProcess(timezone, true, false); - process.run(imagePaths.toArray(new String[imagePaths.size()])); - process.commit(); - repr.start(sk.getRootObjects()); - standardWriter.close(); - - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - /** - * Calls {@link #createStandard(String, String, String[]) createStandard} - * with default arguments - * @param args Ignored - */ - public static void main(String[] args) { - String tempDirPath = System.getProperty("java.io.tmpdir"); - List<List<String>> imagePaths = DiffTest.getImagePaths(); - for(List<String> paths : imagePaths) { - String standardPath = DiffTest.standardPath(paths); - System.out.println("Creating standard for: " + paths.get(0)); - createStandard(standardPath, tempDirPath, paths); - } - } - private static List<String> fileToLines(String filename) { List<String> lines = new LinkedList<String>(); - String line = ""; + String line; try { BufferedReader in = new BufferedReader(new FileReader(new java.io.File(filename).getAbsolutePath())); while ((line = in.readLine()) != null) { lines.add(line); } } catch (IOException ex) { + Logger.getLogger(DiffUtil.class.getName()).log(Level.SEVERE, "Couldn't read file", ex); throw new RuntimeException(ex); } return lines; @@ -103,15 +58,16 @@ private static List<String> fileToLines(String filename) { /** * Returns the diff between the two given files + * * @param pathOriginal The path to the original file * @param pathRevised The path to the revised (new) file * @return A representation of the diff */ - public static String getDiff(String pathOriginal, String pathRevised) { + public static void getDiff(String pathOriginal, String pathRevised, String title) { List<String> originalLines, revisedLines; originalLines = fileToLines(pathOriginal); revisedLines = fileToLines(pathRevised); - + java.io.File outp = new java.io.File(DataModelTestSuite.getRsltPath() + java.io.File.separator + title.replace(".txt", "_Diff.txt")); // Compute diff. Get the Patch object. Patch is the container for computed deltas. Patch patch = DiffUtils.diff(originalLines, revisedLines); StringBuilder diff = new StringBuilder(); @@ -120,7 +76,12 @@ public static String getDiff(String pathOriginal, String pathRevised) { diff.append(delta.toString()); diff.append("\n"); } - - return diff.toString(); + try { + FileWriter out = new FileWriter(outp); + out.append(diff); + out.flush(); + } catch (IOException ex) { + Logger.getLogger(DiffUtil.class.getName()).log(Level.SEVERE, "Couldn't write Diff to file", ex); + } } -} +} \ No newline at end of file diff --git a/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java new file mode 100644 index 0000000000000000000000000000000000000000..e390e9b1aef6a08f419db164b6206e7375adde6b --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java @@ -0,0 +1,58 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.List; + +/** + * A basic implementation of traverser, has a standard test that allows for easy + * modification of the way tests are run + */ +public abstract class ImgTraverser{ + + protected List<String> imagePaths; + protected String exFile; + protected String testStandardPath; + protected String oldStandardPath; + protected String oldExceptionsPath; + + /** + * sets up the variables for a basic test, method can be called for any + * traversal test + * + * @return + */ + public List<Boolean> basicTest() { + String title = DataModelTestSuite.getImgName(imagePaths.get(0)); + java.io.File testFolder = new java.io.File(DataModelTestSuite.getRsltPath()); + java.io.File testStandard = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, this.getClass().getSimpleName(), ".txt")); + testStandardPath = testStandard.getPath(); + exFile = testStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt"); + oldStandardPath = DataModelTestSuite.standardPath(imagePaths, this.getClass().getSimpleName()); + DataModelTestSuite.createStandard(testStandardPath, testFolder.getAbsolutePath(), imagePaths, this); + oldExceptionsPath = oldStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt"); + List<Boolean> ret = new ArrayList<Boolean>(2); + ret.add(DataModelTestSuite.comparecontent(oldExceptionsPath, exFile)); + ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath)); + return ret; + } + abstract public FileWriter traverse(SleuthkitCase sk, String path); +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java b/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java deleted file mode 100644 index df40c6f295fa285f9148998c2f6053ffc7c76d18..0000000000000000000000000000000000000000 --- a/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Sleuth Kit Data Model - * - * 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.datamodel; - -import java.io.IOException; -import java.nio.CharBuffer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.List; -import org.sleuthkit.datamodel.TskData.TSK_FS_META_MODE_ENUM; - -/** - * ReprDataModel writes a String representation (containing the results of all - * public method calls) of a Content object and its children to the given - * Appendable. - * - * @author pmartel - */ -public class ReprDataModel { - - int indentLevel = 0; - Appendable result; - ContentVisitor reprVisitor = new ReprVisitor(); - static final int READ_BUFFER_SIZE = 8192; - static final String HASH_ALGORITHM = "MD5"; - - /** - * - * @param result what to append the generated representation to. - */ - ReprDataModel(Appendable result) { - this.result = result; - } - - /** - * Entry point to represent a Content object and it's children - * @param c the root Content object - */ - public void start(List<Content> lc) { - for(Content c : lc) { - reprContent(c); - } - } - - private void title(String title) { - indent(); - append(title); - append(" >"); - indentLevel++; - nl(); - } - - private void tail() { - indentLevel--; - } - - private void indent() { - char[] indentation = new char[indentLevel]; - Arrays.fill(indentation, '\t'); - append(CharBuffer.wrap(indentation)); - } - - private void nl() { - append("\n"); - } - - private void name(String name) { - append(name); - append(": "); - } - - private void reprContent(Content c) { - title(c.getClass().getSimpleName()); - c.accept(reprVisitor); - readContent(c); - try { - reprChildren(c.getChildren()); - } catch (TskCoreException ex) { - throw new RuntimeException(ex); - } - tail(); - } - - private void readContent(Content c) { - long size = c.getSize(); - byte[] readBuffer = new byte[READ_BUFFER_SIZE]; - try { - MessageDigest md5 = MessageDigest.getInstance("MD5"); - - for (long i = 0; i < size; i = i + READ_BUFFER_SIZE) { - int read = c.read(readBuffer, i, Math.min(size - i, READ_BUFFER_SIZE)); - md5.update(readBuffer); - } - String hash = toHex(md5.digest()); - - repr("read", "md5=" + hash); - - } catch (TskCoreException ex) { - repr("read", ex); - } catch (NoSuchAlgorithmException ex) { - throw new RuntimeException(ex); - } - nl(); - - } - - private String toHex(byte[] bytes) { - StringBuilder hex = new StringBuilder(); - for (byte b : bytes) { - hex.append(String.format("%02x", b & 0xFF)); - } - return hex.toString(); - } - - private void reprChildren(List<? extends Content> lc) { - for (Content c : lc) { - reprContent(c); - } - } - - // Files and Directories can be handled the same - private void reprFsContent(FsContent fsc) { - repr("getAtime", fsc.getAtime()); - repr("getAtimeAsDate", fsc.getAtimeAsDate()); - repr("getAttr_id", fsc.getAttrId()); - repr("getAttr_type", fsc.getAttrType().toString()); - repr("getCrtime", fsc.getCrtime()); - repr("getCrtimeAsDate", fsc.getCrtimeAsDate()); - repr("getCtime", fsc.getCtime()); - repr("getCtimeAsDate", fsc.getCtimeAsDate()); - repr("getDirFlagsAsString", fsc.getDirFlagAsString()); - repr("getDirType", fsc.getDirType().getValue()); - repr("getDirTypeAsString", fsc.getDirTypeAsString()); - repr("getGid", fsc.getGid()); - repr("getMetaFlagsAsString", fsc.getMetaFlagsAsString()); - repr("getMetaTypeAsString", fsc.getMetaTypeAsString()); - repr("getMetaAddr", fsc.getMetaAddr()); - repr("getMetaType", fsc.getMetaType().getValue()); - repr("getMtime", fsc.getMtime()); - repr("getMtimeAsDate", fsc.getMtimeAsDate()); - repr("getName", fsc.getName()); - repr("getParentPath", fsc.getParentPath()); - repr("getSize", fsc.getSize()); - repr("getUid", fsc.getUid()); - } - - private void reprLayoutFile(LayoutFile lf) { - repr("getSize", lf.getSize()); - repr("getId", lf.getId()); - repr("getName", lf.getName()); - repr("getNumPartsu", (long)lf.getNumParts()); - - } - - private void reprLayoutDirectory(VirtualDirectory ld) { - repr("getSize", ld.getSize()); - repr("getId", ld.getId()); - repr("getName", ld.getName()); - } - - private void reprFileSystem(FileSystem fs) { - repr("getBlock_count", fs.getBlock_count()); - repr("getBlock_size", fs.getBlock_size()); - - /* - * Don't get handle, it's not consistent (a memory pointer). - * - try { - repr("getFileSystemHandle", fs.getFileSystemHandle()); - } catch (TskException ex) { - throw new RuntimeException(ex); - } - * - */ - repr("getFirst_inum", fs.getFirst_inum()); - repr("getFs_type", fs.getFsType().getValue()); - repr("getImg_offset", fs.getImageOffset()); - repr("getLast_inum", fs.getLastInum()); - repr("getRoot_inum", fs.getRoot_inum()); - repr("getSize", fs.getSize()); - } - - private void reprImage(Image i) { - /* - * Don't get handle, it's not consistent (a memory pointer). - * - repr("getImageHandle", i.getImageHandle()); - * - */ - repr("getName", i.getName()); - /** - * Don't get paths, they're system specific. - * - repr("getPaths", i.getPaths()); - * - */ - repr("getSize", i.getSize()); - repr("getSsize", i.getSsize()); - repr("getType", i.getType()); - try { - int typeID = i.getSleuthkitCase().addArtifactType("Test_Artifact", "Test Artifact"); - BlackboardArtifact art1; - BlackboardArtifact art2; - BlackboardArtifact art3; - art1 = i.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); - art2 = i.newArtifact(typeID); - art3 = i.newArtifact(1); - byte[] bytearray1 = new byte[2]; - bytearray1[0] = 1; - bytearray1[1] = 2; - byte[] bytearray2 = new byte[2]; - bytearray2[0] = 3; - bytearray2[1] = 4; - byte[] bytearray3 = new byte[2]; - bytearray3[0] = 5; - bytearray3[1] = 6; - - int attrTypeID = i.getSleuthkitCase().addAttrType("testattr", "Test Attribute"); - - art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "first_call", (int) 23)); - art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "second_call", (long) 5)); - art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "third_call", (double) 7.412)); - art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "fourth_call", "test")); - art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "fifth_call", bytearray1)); - art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID(), "regressionTest", "sixth_call", (int) 23)); - art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FLAG.getTypeID(), "regressionTest", "seventh_call", (long) 5)); - art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID(), "regressionTest", "eighth_call", (double) 7.412)); - art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID(), "regressionTest", "nineth_call", "test")); - art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SET.getTypeID(), "regressionTest", "tenth_call", bytearray2)); - art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "eleventh_call", (int) 29)); - art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "twelfth_call", (long) 565413)); - art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "thirteenth_call", (double) 1.987)); - art3.addAttribute(new BlackboardAttribute(2, "regressionTest", "fourteenth_call", "test2")); - art3.addAttribute(new BlackboardAttribute(2, "regressionTest", "fifteenth_call", bytearray3)); - - for(BlackboardArtifact art : i.getAllArtifacts()){ - repr("ArtifactGetArtifactID", art.getArtifactID()); - repr("ArtifactGetArtifactTypeID", new Integer(art.getArtifactTypeID()).toString()); - repr("ArtifactGetArtifactTypeName", art.getArtifactTypeName()); - repr("ArtifactGetDisplayName", art.getDisplayName()); - repr("ArtifactGetObjectID", art.getObjectID()); - for(BlackboardAttribute attr : art.getAttributes()){ - repr("AttributeGetArtifactID", attr.getArtifactID()); - repr("AttributeGetAttributeTypeID", new Integer(attr.getAttributeTypeID()).toString()); - repr("AttributeGetAttributeTypeName", i.getSleuthkitCase().getAttrTypeString(attr.getAttributeTypeID())); - repr("AttributeGetDisplayName", i.getSleuthkitCase().getAttrTypeDisplayName(attr.getAttributeTypeID())); - repr("AttributeGetContext", attr.getContext()); - repr("AttributeGetSource", attr.getModuleName()); - BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE val_type = attr.getValueType(); - repr("AttributeGetValueType", val_type.getLabel()); - switch(val_type){ - case STRING: - repr("AttributeGetValue" + val_type.getLabel(), attr.getValueString()); - break; - case BYTE: - repr("AttributeGetValue" + val_type.getLabel(), Arrays.toString(attr.getValueBytes())); - break; - case INTEGER: - repr("AttributeGetValue" + val_type.getLabel(), new Integer(attr.getValueInt()).toString()); - break; - case LONG: - repr("AttributeGetValue" + val_type.getLabel(), attr.getValueLong()); - break; - case DOUBLE: - repr("AttributeGetValue" + val_type.getLabel(), new Double(attr.getValueDouble()).toString()); - break; - } - } - } - - } catch (TskCoreException ex) { - throw new RuntimeException(ex); - } - } - - private void reprVolume(Volume v) { - repr("getAddr", v.getAddr()); - repr("getDescription", v.getDescription()); - repr("getFlags", v.getFlags()); - repr("getFlagsAsString", v.getFlagsAsString()); - repr("getLength", v.getLength()); - repr("getSize", v.getSize()); - repr("getStart", v.getStart()); - } - - private void reprVolumeSystem(VolumeSystem vs) { - repr("getBlockSize", vs.getBlockSize()); - repr("getOffset", vs.getOffset()); - repr("getSize", vs.getSize()); - repr("getType", vs.getType()); - /* - * Don't get handle, it's not consistent (a memory pointer). - * - try { - repr("getVolumeSystemHandle", vs.getVolumeSystemHandle()); - } catch (TskException ex) { - throw new RuntimeException(ex); - } - * - */ - } - - private void repr(String method, Long l) { - indent(); - name(method); - append(l.toString()); - nl(); - } - - private void repr(String method, Integer l) { - indent(); - name(method); - append(l.toString()); - nl(); - } - - private void repr(String method, Short l) { - indent(); - name(method); - append(l.toString()); - nl(); - } - - private void repr(String method, Byte l) { - indent(); - name(method); - append(l.toString()); - nl(); - } - - private void repr(String method, String[] sArray) { - indent(); - name(method); - append(Arrays.toString(sArray)); - nl(); - } - - private void repr(String method, String s) { - indent(); - name(method); - append(s); - nl(); - } - - private void repr(String method, Exception ex) { - indent(); - name(method); - nl(); - append(ex.toString()); - nl(); - } - - private void append(CharSequence s) { - try { - System.out.append(s); - System.out.flush(); - result.append(s); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - - private class ReprVisitor implements ContentVisitor<Void> { - - @Override - public Void visit(LayoutFile u) { - reprLayoutFile(u); - return null; - } - - @Override - public Void visit(VirtualDirectory u) { - reprLayoutDirectory(u); - return null; - } - - - - @Override - public Void visit(Directory d) { - reprFsContent(d); - return null; - } - - @Override - public Void visit(File f) { - reprFsContent(f); - return null; - } - - @Override - public Void visit(FileSystem fs) { - reprFileSystem(fs); - return null; - } - - @Override - public Void visit(Image i) { - reprImage(i); - return null; - } - - @Override - public Void visit(Volume v) { - reprVolume(v); - return null; - } - - @Override - public Void visit(VolumeSystem vs) { - reprVolumeSystem(vs); - return null; - } - } -} diff --git a/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java new file mode 100644 index 0000000000000000000000000000000000000000..dd2b60756580f11a337ffc40607c6852be1124cc --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java @@ -0,0 +1,113 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** + * + * Traverses an image by running through item Ids ascending. + */ +@RunWith(Parameterized.class) +public class SequentialTraversal extends ImgTraverser { + + private static final Logger logg = Logger.getLogger(SequentialTraversal.class.getName()); + + public SequentialTraversal(List<String> imagePaths) { + this.imagePaths = imagePaths; + } + + /** + * Get the sets of filenames for each test image, they should be located in + * the folder specified by the build.xml + * + * @return A Collection of one-element Object arrays, where that one element + * is a List<String> containing the image file paths (the type is weird + * because that's what JUnit wants for parameters). + */ + @Parameterized.Parameters + public static Collection<Object[]> testImageData() { + Collection<Object[]> data = new ArrayList<Object[]>(); + + for (Object imagePaths : DataModelTestSuite.getImagePaths()) { + data.add(new Object[]{imagePaths}); + } + return data; + } + + /** + * Runs the test + */ + @Test + public void testSequentialDiff() { + try { + List<Boolean> test = basicTest(); + assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true); + assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true); + } catch (Exception ex) { + fail("Couldn't open gold standard file."); + } + } + + /** + * Traverses through an image and generates a sequential representation of + * the image + * + * @param sk the sleuthkit case used for the traversal + * @param path the location of the output file + * @param exFile the exFile to store exceptions, is only used for + * compatability with basic test + * @return the file writer to be closed by testStandard + */ + @Override + public FileWriter traverse(SleuthkitCase sk, String path) { + FileWriter reslt; + try { + reslt = new FileWriter(path); + int x = 1; + Content c; + try { + while ((c = sk.getContentById(x)) != null) { + reslt.append(((AbstractContent) c).toString(false)); + if (c instanceof File) { + DataModelTestSuite.readContent(c, reslt, exFile); + } + reslt.append("\n"); + x++; + } + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(testStandardPath, ex); + } + return reslt; + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + return null; + } + } +} diff --git a/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java new file mode 100644 index 0000000000000000000000000000000000000000..cbdcc35c8c061e6343d19864eada0b26529bdfc0 --- /dev/null +++ b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java @@ -0,0 +1,149 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2013 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.datamodel; + +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * + * Verifies that the current version of TSK produces the same output of previous + * versions by doing a TopDown Depth first traversal of the given images. + */ +@RunWith(Parameterized.class) +public class TopDownTraversal extends ImgTraverser { + + private static final Logger logg = Logger.getLogger(TopDownTraversal.class.getName()); + + public TopDownTraversal(List<String> imagePaths) { + this.imagePaths = imagePaths; + } + + /** + * Get the sets of filenames for each test image, they should be located in + * the folder specified by the build.xml + * + * @return A Collection of one-element Object arrays, where that one element + * is a List<String> containing the image file paths (the type is weird + * because that's what JUnit wants for parameters). + */ + @Parameters + public static Collection<Object[]> testImageData() { + Collection<Object[]> data = new ArrayList<Object[]>(); + + for (Object imagePaths : DataModelTestSuite.getImagePaths()) { + data.add(new Object[]{imagePaths}); + } + return data; + } + + /** + * Runs the test + */ + @Test + public void testTopDownDiff() { + try { + List<Boolean> test = basicTest(); + assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true); + assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true); + } catch (Exception ex) { + fail("Couldn't open gold standard file."); + } + } + + /** + * Traverses through an image and generates a top down representation the + * image + * + * @param sk the sleuthkit case used for the traversal + * @param path the location of the output file + * @param exFile the exFile to store exceptions + * @return the file writer to be closed by testStandard + */ + @Override + public FileWriter traverse(SleuthkitCase sk, String path) { + List<Content> lc = null; + try { + lc = sk.getRootObjects(); + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(testStandardPath, ex); + } + List<Long> lp = new ArrayList<Long>(); + try { + FileWriter reslt = new FileWriter(path); + FileWriter levs = new FileWriter(path.replace("_" + this.getClass().getSimpleName() + ".txt", DataModelTestSuite.LVS + ".txt")); + topDownDF(lc, lp, reslt, levs); + levs.flush(); + return reslt; + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + return null; + } + } + + /** + * Traverses through an image and generates a TSK gettimes like + * representation + * + * @param lc the list of content to be traversed + * @param lp the list of a content's parents + * @param reslt the filewriter to append output to + * @param levs the filewriter to append leaves to + */ + private void topDownDF(List<Content> lc, List<Long> lp, Appendable reslt, Appendable levs) { + for (Content c : lc) { + try { + reslt.append(((AbstractContent) c).toString(false)); + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + } + if (c instanceof File) { + DataModelTestSuite.readContent(c, reslt, testStandardPath); + } + try { + reslt.append("\n"); + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + } + lp.add(0, c.getId()); + try { + if (c.getChildren().isEmpty()) { + levs.append(lp.toString() + "\n"); + } else { + topDownDF(c.getChildren(), new ArrayList<Long>(lp), reslt, levs); + } + } catch (IOException ex) { + logg.log(Level.SEVERE, "Failed to Traverse", ex); + } catch (TskCoreException ex) { + DataModelTestSuite.writeExceptions(testStandardPath, ex); + } + lp.remove(0); + } + } +} \ No newline at end of file diff --git a/bindings/java/teststandards/fe_test_4_standard.txt b/bindings/java/teststandards/fe_test_4_standard.txt deleted file mode 100644 index dc5f9a4599ed106df7970a92198c7eabbeef7eef..0000000000000000000000000000000000000000 --- a/bindings/java/teststandards/fe_test_4_standard.txt +++ /dev/null @@ -1,1231 +0,0 @@ -Image > - getName: fe_test_4.img - getSize: 0 - getSsize: 512 - getType: 2 - ArtifactGetArtifactID: 1 - ArtifactGetArtifactTypeID: 1 - ArtifactGetArtifactTypeName: TSK_GEN_INFO - ArtifactGetDisplayName: General Info - ArtifactGetObjectID: 1 - AttributeGetArtifactID: 1 - AttributeGetAttributeTypeID: 1001 - AttributeGetAttributeTypeName: testattr - AttributeGetDisplayName: Test Attribute - AttributeGetContext: first_call - AttributeGetSource: regressionTest - AttributeGetValueType: Integer - AttributeGetValueInteger: 23 - AttributeGetArtifactID: 1 - AttributeGetAttributeTypeID: 1001 - AttributeGetAttributeTypeName: testattr - AttributeGetDisplayName: Test Attribute - AttributeGetContext: second_call - AttributeGetSource: regressionTest - AttributeGetValueType: Long - AttributeGetValueLong: 5 - AttributeGetArtifactID: 1 - AttributeGetAttributeTypeID: 1001 - AttributeGetAttributeTypeName: testattr - AttributeGetDisplayName: Test Attribute - AttributeGetContext: third_call - AttributeGetSource: regressionTest - AttributeGetValueType: Double - AttributeGetValueDouble: 7.412 - AttributeGetArtifactID: 1 - AttributeGetAttributeTypeID: 1001 - AttributeGetAttributeTypeName: testattr - AttributeGetDisplayName: Test Attribute - AttributeGetContext: fourth_call - AttributeGetSource: regressionTest - AttributeGetValueType: String - AttributeGetValueString: test - AttributeGetArtifactID: 1 - AttributeGetAttributeTypeID: 1001 - AttributeGetAttributeTypeName: testattr - AttributeGetDisplayName: Test Attribute - AttributeGetContext: fifth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Byte - AttributeGetValueByte: [1, 2] - ArtifactGetArtifactID: 2 - ArtifactGetArtifactTypeID: 1001 - ArtifactGetArtifactTypeName: Test_Artifact - ArtifactGetDisplayName: Test Artifact - ArtifactGetObjectID: 1 - AttributeGetArtifactID: 2 - AttributeGetAttributeTypeID: 2 - AttributeGetAttributeTypeName: TSK_DATETIME - AttributeGetDisplayName: Date Time - AttributeGetContext: sixth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Integer - AttributeGetValueInteger: 23 - AttributeGetArtifactID: 2 - AttributeGetAttributeTypeID: 7 - AttributeGetAttributeTypeName: TSK_FLAG - AttributeGetDisplayName: Flag - AttributeGetContext: seventh_call - AttributeGetSource: regressionTest - AttributeGetValueType: Long - AttributeGetValueLong: 5 - AttributeGetArtifactID: 2 - AttributeGetAttributeTypeID: 9 - AttributeGetAttributeTypeName: TSK_GEO - AttributeGetDisplayName: Geo - AttributeGetContext: eighth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Double - AttributeGetValueDouble: 7.412 - AttributeGetArtifactID: 2 - AttributeGetAttributeTypeID: 10 - AttributeGetAttributeTypeName: TSK_KEYWORD - AttributeGetDisplayName: Keyword - AttributeGetContext: nineth_call - AttributeGetSource: regressionTest - AttributeGetValueType: String - AttributeGetValueString: test - AttributeGetArtifactID: 2 - AttributeGetAttributeTypeID: 13 - AttributeGetAttributeTypeName: TSK_KEYWORD_SET - AttributeGetDisplayName: Keyword Set - AttributeGetContext: tenth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Byte - AttributeGetValueByte: [3, 4] - ArtifactGetArtifactID: 3 - ArtifactGetArtifactTypeID: 1 - ArtifactGetArtifactTypeName: TSK_GEN_INFO - ArtifactGetDisplayName: General Info - ArtifactGetObjectID: 1 - AttributeGetArtifactID: 3 - AttributeGetAttributeTypeID: 1 - AttributeGetAttributeTypeName: TSK_URL - AttributeGetDisplayName: URL - AttributeGetContext: eleventh_call - AttributeGetSource: regressionTest - AttributeGetValueType: Integer - AttributeGetValueInteger: 29 - AttributeGetArtifactID: 3 - AttributeGetAttributeTypeID: 1 - AttributeGetAttributeTypeName: TSK_URL - AttributeGetDisplayName: URL - AttributeGetContext: twelfth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Long - AttributeGetValueLong: 565413 - AttributeGetArtifactID: 3 - AttributeGetAttributeTypeID: 1 - AttributeGetAttributeTypeName: TSK_URL - AttributeGetDisplayName: URL - AttributeGetContext: thirteenth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Double - AttributeGetValueDouble: 1.987 - AttributeGetArtifactID: 3 - AttributeGetAttributeTypeID: 2 - AttributeGetAttributeTypeName: TSK_DATETIME - AttributeGetDisplayName: Date Time - AttributeGetContext: fourteenth_call - AttributeGetSource: regressionTest - AttributeGetValueType: String - AttributeGetValueString: test2 - AttributeGetArtifactID: 3 - AttributeGetAttributeTypeID: 2 - AttributeGetAttributeTypeName: TSK_DATETIME - AttributeGetDisplayName: Date Time - AttributeGetContext: fifteenth_call - AttributeGetSource: regressionTest - AttributeGetValueType: Byte - AttributeGetValueByte: [5, 6] - read: md5=d41d8cd98f00b204e9800998ecf8427e - - VolumeSystem > - getBlockSize: 512 - getOffset: 0 - getSize: 0 - getType: 1 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - Volume > - getAddr: 1 - getDescription: Unallocated - getFlags: 2 - getFlagsAsString: Unallocated - getLength: 63 - getSize: 63 - getStart: 0 - read: md5=19471762cfa7d159173589cc1f7eaf8f - - Volume > - getAddr: 2 - getDescription: Win95 FAT32 (0x0B) - getFlags: 1 - getFlagsAsString: Allocated - getLength: 32067 - getSize: 32067 - getStart: 63 - read: md5=2698a303804310c068569cd12830a6b2 - - FileSystem > - getBlock_count: 32066 - getBlock_size: 512 - getFirst_inum: 2 - getFs_type: 2 - getImg_offset: 32256 - getLast_inum: 512662 - getRoot_inum: 2 - getSize: 16417792 - read: md5=153555ba7e27f520282851b78b260fb8 - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 2 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: - getParentPath: / - getSize: 16384 - getUid: 0 - read: md5=81c08f35401c144854c40fe5b9383b38 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 512660 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $FAT1 - getParentPath: / - getSize: 6144 - getUid: 0 - read: md5=ac5750e6eb5ab94ea394023d43ab4b50 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 512661 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $FAT2 - getParentPath: / - getSize: 6144 - getUid: 0 - read: md5=ac5750e6eb5ab94ea394023d43ab4b50 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 512659 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $MBR - getParentPath: / - getSize: 512 - getUid: 0 - read: md5=f87a92f7f10eb15763230c71c3f84629 - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 512662 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $OrphanFiles - getParentPath: / - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - Directory > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915024 - getCrtimeAsDate: 2010-10-12 16:23:44 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 4 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 511 - getModeAsString: drwxrwxrwx - getMtime: 1286915024 - getMtimeAsDate: 2010-10-12 16:23:44 - getName: dir 1 - getParentPath: / - getSize: 4096 - getUid: 0 - read: md5=84f0eae9b626031286d45c1909ec0083 - - Directory > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915024 - getCrtimeAsDate: 2010-10-12 16:23:44 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 4 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 511 - getModeAsString: drwxrwxrwx - getMtime: 1286915024 - getMtimeAsDate: 2010-10-12 16:23:44 - getName: . - getParentPath: /dir 1/ - getSize: 4096 - getUid: 0 - read: md5=84f0eae9b626031286d45c1909ec0083 - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915016 - getCrtimeAsDate: 2010-10-12 16:23:36 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 648 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915016 - getMtimeAsDate: 2010-10-12 16:23:36 - getName: filler1 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915016 - getCrtimeAsDate: 2010-10-12 16:23:36 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 650 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915016 - getMtimeAsDate: 2010-10-12 16:23:36 - getName: filler2 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915016 - getCrtimeAsDate: 2010-10-12 16:23:36 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 652 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915016 - getMtimeAsDate: 2010-10-12 16:23:36 - getName: filler3 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915018 - getCrtimeAsDate: 2010-10-12 16:23:38 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 654 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915018 - getMtimeAsDate: 2010-10-12 16:23:38 - getName: filler4 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915018 - getCrtimeAsDate: 2010-10-12 16:23:38 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 656 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915018 - getMtimeAsDate: 2010-10-12 16:23:38 - getName: filler5 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915018 - getCrtimeAsDate: 2010-10-12 16:23:38 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 658 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915018 - getMtimeAsDate: 2010-10-12 16:23:38 - getName: filler6 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915020 - getCrtimeAsDate: 2010-10-12 16:23:40 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 660 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915020 - getMtimeAsDate: 2010-10-12 16:23:40 - getName: filler7 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286915024 - getCrtimeAsDate: 2010-10-12 16:23:44 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 662 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286915024 - getMtimeAsDate: 2010-10-12 16:23:44 - getName: filler8 - getParentPath: /dir 1/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286895424 - getCrtimeAsDate: 2010-10-12 10:57:04 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 646 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286895424 - getMtimeAsDate: 2010-10-12 10:57:04 - getName: maytag0.jpg - getParentPath: /dir 1/ - getSize: 9023 - getUid: 0 - read: md5=048857eca91ffed071cb8b8a1b3e3235 - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 2 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: .. - getParentPath: /dir 1/ - getSize: 16384 - getUid: 0 - read: md5=81c08f35401c144854c40fe5b9383b38 - - Volume > - getAddr: 3 - getDescription: Linux (0x83) - getFlags: 1 - getFlagsAsString: Allocated - getLength: 16065 - getSize: 16065 - getStart: 32130 - read: md5=8142e94785941496227c3928416c5e43 - - Volume > - getAddr: 4 - getDescription: Win95 FAT32 (0x0B) - getFlags: 1 - getFlagsAsString: Allocated - getLength: 16065 - getSize: 16065 - getStart: 48195 - read: md5=94b22c428ae4a38d484f1d717f43570a - - FileSystem > - getBlock_count: 16064 - getBlock_size: 512 - getFirst_inum: 2 - getFs_type: 2 - getImg_offset: 24675840 - getLast_inum: 256630 - getRoot_inum: 2 - getSize: 8224768 - read: md5=52e241659c3e1a5e4f6a124f30ce31bf - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 2 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: - getParentPath: / - getSize: 16384 - getUid: 0 - read: md5=75835fc58e872c3b0fc80ac516265912 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 256628 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $FAT1 - getParentPath: / - getSize: 6144 - getUid: 0 - read: md5=0dc62184de6df1c53c549c2408663654 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 256629 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $FAT2 - getParentPath: / - getSize: 6144 - getUid: 0 - read: md5=0dc62184de6df1c53c549c2408663654 - - File > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: v - getDir_flags: 1 - getDir_type: 10 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: v - getMeta_addr: 256627 - getMeta_flags: 5 - getMeta_type: 10 - getMode: 0 - getModeAsString: v--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $MBR - getParentPath: / - getSize: 512 - getUid: 0 - read: md5=ae9b1438441ee0c1ef68fdcc85fd620a - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 256630 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: $OrphanFiles - getParentPath: / - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - Directory > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914962 - getCrtimeAsDate: 2010-10-12 16:22:42 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 4 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 511 - getModeAsString: drwxrwxrwx - getMtime: 1286914978 - getMtimeAsDate: 2010-10-12 16:22:58 - getName: dir 2 - getParentPath: / - getSize: 2048 - getUid: 0 - read: md5=1dfbdb6600e081008cb448d0e69f7ac9 - - Directory > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914962 - getCrtimeAsDate: 2010-10-12 16:22:42 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 4 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 511 - getModeAsString: drwxrwxrwx - getMtime: 1286914978 - getMtimeAsDate: 2010-10-12 16:22:58 - getName: . - getParentPath: /dir 2/ - getSize: 2048 - getUid: 0 - read: md5=1dfbdb6600e081008cb448d0e69f7ac9 - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914242 - getCrtimeAsDate: 2010-10-12 16:10:42 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: r - getDir_flags: 1 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: r - getMeta_addr: 599 - getMeta_flags: 5 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914242 - getMtimeAsDate: 2010-10-12 16:10:42 - getName: about_maytag.txt - getParentPath: /dir 2/ - getSize: 5158 - getUid: 0 - read: md5=940fafae14bfc68df90ad2e62696392e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914956 - getCrtimeAsDate: 2010-10-12 16:22:36 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 582 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914956 - getMtimeAsDate: 2010-10-12 16:22:36 - getName: filler1 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914958 - getCrtimeAsDate: 2010-10-12 16:22:38 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 584 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914958 - getMtimeAsDate: 2010-10-12 16:22:38 - getName: filler2 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914958 - getCrtimeAsDate: 2010-10-12 16:22:38 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 586 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914958 - getMtimeAsDate: 2010-10-12 16:22:38 - getName: filler3 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914960 - getCrtimeAsDate: 2010-10-12 16:22:40 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 588 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914960 - getMtimeAsDate: 2010-10-12 16:22:40 - getName: filler4 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914960 - getCrtimeAsDate: 2010-10-12 16:22:40 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 590 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914960 - getMtimeAsDate: 2010-10-12 16:22:40 - getName: filler5 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914960 - getCrtimeAsDate: 2010-10-12 16:22:40 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 592 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914960 - getMtimeAsDate: 2010-10-12 16:22:40 - getName: filler6 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914962 - getCrtimeAsDate: 2010-10-12 16:22:42 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 594 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914962 - getMtimeAsDate: 2010-10-12 16:22:42 - getName: filler7 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - File > - getAtime: 1286856000 - getAtimeAsDate: 2010-10-12 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 1286914962 - getCrtimeAsDate: 2010-10-12 16:22:42 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Unallocated - getDirTypeAsString: r - getDir_flags: 2 - getDir_type: 5 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Unallocated - getMetaTypeAsString: r - getMeta_addr: 596 - getMeta_flags: 6 - getMeta_type: 1 - getMode: 511 - getModeAsString: rrwxrwxrwx - getMtime: 1286914962 - getMtimeAsDate: 2010-10-12 16:22:42 - getName: filler8 - getParentPath: /dir 2/ - getSize: 0 - getUid: 0 - read: md5=d41d8cd98f00b204e9800998ecf8427e - - Directory > - getAtime: 0 - getAtimeAsDate: 0000-00-00 00:00:00 - getAttr_id: 0 - getAttr_type: 1 - getCrtime: 0 - getCrtimeAsDate: 0000-00-00 00:00:00 - getCtime: 0 - getCtimeAsDate: 0000-00-00 00:00:00 - getDirFlagsAsString: Allocated - getDirTypeAsString: d - getDir_flags: 1 - getDir_type: 3 - getDirtype: 0 - getGid: 0 - getMetaFlagsAsString: Allocated - getMetaTypeAsString: d - getMeta_addr: 2 - getMeta_flags: 5 - getMeta_type: 2 - getMode: 0 - getModeAsString: d--------- - getMtime: 0 - getMtimeAsDate: 0000-00-00 00:00:00 - getName: .. - getParentPath: /dir 2/ - getSize: 16384 - getUid: 0 - read: md5=75835fc58e872c3b0fc80ac516265912 - diff --git a/framework/TskModules/c_FileTypeSigModule b/framework/TskModules/c_FileTypeSigModule index 2e315f7460699b4892df69e709b4893d39953e65..21ee2fe7c16a3ee5e4675a14382e3248d776ef57 160000 --- a/framework/TskModules/c_FileTypeSigModule +++ b/framework/TskModules/c_FileTypeSigModule @@ -1 +1 @@ -Subproject commit 2e315f7460699b4892df69e709b4893d39953e65 +Subproject commit 21ee2fe7c16a3ee5e4675a14382e3248d776ef57 diff --git a/framework/TskModules/c_HashCalcModule b/framework/TskModules/c_HashCalcModule index faa0197f7f7d6a7cb64c7366522b90dd2cea7599..662661eb5476c5b42387d7796d949c5391123330 160000 --- a/framework/TskModules/c_HashCalcModule +++ b/framework/TskModules/c_HashCalcModule @@ -1 +1 @@ -Subproject commit faa0197f7f7d6a7cb64c7366522b90dd2cea7599 +Subproject commit 662661eb5476c5b42387d7796d949c5391123330 diff --git a/framework/TskModules/c_RegRipperModule b/framework/TskModules/c_RegRipperModule index 564b8aca3f3628dd1de5bae462c2c35aff6a8c6d..a5d916393ca0910bea99026804f7eec8d9b186b5 160000 --- a/framework/TskModules/c_RegRipperModule +++ b/framework/TskModules/c_RegRipperModule @@ -1 +1 @@ -Subproject commit 564b8aca3f3628dd1de5bae462c2c35aff6a8c6d +Subproject commit a5d916393ca0910bea99026804f7eec8d9b186b5 diff --git a/framework/TskModules/c_SummaryReportModule b/framework/TskModules/c_SummaryReportModule index 8eaf74d45d7bfd4c310087a6c1b482d0ddc8d8c5..cc9d19a0082371df88d3e637d6b439ba43e7b41a 160000 --- a/framework/TskModules/c_SummaryReportModule +++ b/framework/TskModules/c_SummaryReportModule @@ -1 +1 @@ -Subproject commit 8eaf74d45d7bfd4c310087a6c1b482d0ddc8d8c5 +Subproject commit cc9d19a0082371df88d3e637d6b439ba43e7b41a