diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java index 6afbc66aae..ea0a2c03a0 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java @@ -332,7 +332,7 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo return false; } - if (file.getDirFlag() == TSK_FS_NAME_FLAG_ENUM.UNALLOC) { + if (file.isDirNameFlagSet(TSK_FS_NAME_FLAG_ENUM.UNALLOC)) { return false; } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java index 73233bfe91..9e576bbca1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java @@ -18,71 +18,62 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import org.openide.nodes.Sheet; import org.sleuthkit.datamodel.FsContent; +import org.sleuthkit.datamodel.TskData.TSK_FS_META_FLAG_ENUM; import org.sleuthkit.datamodel.TskData.TSK_FS_META_MODE_ENUM; +import org.sleuthkit.datamodel.TskData.TSK_FS_NAME_FLAG_ENUM; /** * Abstract class that implements the commonality between File and Directory * Nodes (same properties). - */ + */ public abstract class AbstractFsContentNode extends AbstractAbstractFileNode { - - // Note: this order matters for the search result, changed it if the order of property headers on the "KeywordSearchNode"changed + // Note: this order matters for the search result, changed it if the order of property headers on the "KeywordSearchNode"changed public static enum FsContentPropertyType { NAME { - @Override public String toString() { return "Name"; } }, LOCATION { - - @Override public String toString() { return "Location"; } }, MOD_TIME { - - @Override public String toString() { return "Mod. Time"; } }, CHANGED_TIME { - - @Override public String toString() { return "Change Time"; } }, ACCESS_TIME { - - @Override public String toString() { return "Access Time"; } }, CREATED_TIME { - - @Override public String toString() { return "Created Time"; } }, SIZE { - @Override public String toString() { return "Size"; @@ -95,80 +86,66 @@ public abstract class AbstractFsContentNode extends Abstrac } }, FLAGS_META { - @Override public String toString() { return "Flags(Meta)"; } }, MODE { - @Override public String toString() { return "Mode"; } }, USER_ID { - @Override public String toString() { return "UserID"; } }, GROUP_ID { - @Override + @Override public String toString() { return "GroupID"; } }, META_ADDR { - @Override public String toString() { return "Meta Addr."; } }, ATTR_ADDR { - - @Override public String toString() { return "Attr. Addr."; } }, TYPE_DIR { - - - @Override public String toString() { return "Type(Dir)"; } }, TYPE_META { - @Override public String toString() { return "Type(Meta)"; } }, KNOWN { - - @Override public String toString() { return "Known"; } }, MD5HASH { - - @Override public String toString() { return "MD5 Hash"; } - }, - } + } + } private boolean directoryBrowseMode; public static final String HIDE_PARENT = "hide_parent"; @@ -176,21 +153,21 @@ public abstract class AbstractFsContentNode extends Abstrac AbstractFsContentNode(T fsContent) { this(fsContent, true); } - - + /** * Constructor + * * @param fsContent the fsContent - * @param directoryBrowseMode how the user caused this node - * to be created: if by browsing the image contents, it is true. If by - * selecting a file filter (e.g. 'type' or 'recent'), it is false + * @param directoryBrowseMode how the user caused this node to be created: + * if by browsing the image contents, it is true. If by selecting a file + * filter (e.g. 'type' or 'recent'), it is false */ AbstractFsContentNode(T fsContent, boolean directoryBrowseMode) { super(fsContent); this.setDisplayName(AbstractFsContentNode.getFsContentName(fsContent)); this.directoryBrowseMode = directoryBrowseMode; } - + public boolean getDirectoryBrowseMode() { return directoryBrowseMode; } @@ -215,7 +192,7 @@ public abstract class AbstractFsContentNode extends Abstrac final String propString = propType.toString(); ss.put(new NodeProperty(propString, propString, NO_DESCR, map.get(propString))); } - if(directoryBrowseMode) { + if (directoryBrowseMode) { ss.put(new NodeProperty(HIDE_PARENT, HIDE_PARENT, HIDE_PARENT, HIDE_PARENT)); } @@ -224,21 +201,23 @@ public abstract class AbstractFsContentNode extends Abstrac /** * Fill map with FsContent properties - * - * @param map map with preserved ordering, where property names/values are put + * + * @param map map with preserved ordering, where property names/values are + * put * @param content to extract properties from */ public static void fillPropertyMap(Map map, FsContent content) { + map.put(FsContentPropertyType.NAME.toString(), getFsContentName(content)); map.put(FsContentPropertyType.LOCATION.toString(), DataConversion.getformattedPath(ContentUtils.getDisplayPath(content), 0, 1)); - map.put(FsContentPropertyType.MOD_TIME.toString(), ContentUtils.getStringTime(content.getMtime(), content)); + map.put(FsContentPropertyType.MOD_TIME.toString(), ContentUtils.getStringTime(content.getMtime(), content)); map.put(FsContentPropertyType.CHANGED_TIME.toString(), ContentUtils.getStringTime(content.getCtime(), content)); map.put(FsContentPropertyType.ACCESS_TIME.toString(), ContentUtils.getStringTime(content.getAtime(), content)); map.put(FsContentPropertyType.CREATED_TIME.toString(), ContentUtils.getStringTime(content.getCrtime(), content)); map.put(FsContentPropertyType.SIZE.toString(), content.getSize()); - map.put(FsContentPropertyType.FLAGS_DIR.toString(), content.getDirFlag().toString()); - map.put(FsContentPropertyType.FLAGS_META.toString(), Integer.toString(content.getMetaFlagsInt())); - map.put(FsContentPropertyType.MODE.toString(), TSK_FS_META_MODE_ENUM.toString(content.getModes(), content.getMetaType())); + map.put(FsContentPropertyType.FLAGS_DIR.toString(), content.getDirFlagAsString()); + map.put(FsContentPropertyType.FLAGS_META.toString(), content.getMetaFlagsAsString()); + map.put(FsContentPropertyType.MODE.toString(), content.getModesAsString()); map.put(FsContentPropertyType.USER_ID.toString(), content.getUid()); map.put(FsContentPropertyType.GROUP_ID.toString(), content.getGid()); map.put(FsContentPropertyType.META_ADDR.toString(), content.getMetaAddr()); @@ -248,12 +227,12 @@ public abstract class AbstractFsContentNode extends Abstrac map.put(FsContentPropertyType.KNOWN.toString(), content.getKnown().getName()); map.put(FsContentPropertyType.MD5HASH.toString(), content.getMd5Hash() == null ? "" : content.getMd5Hash()); } - + static String getFsContentName(FsContent fsContent) { String name = fsContent.getName(); - if(name.equals("..")) { + if (name.equals("..")) { name = DirectoryNode.DOTDOTDIR; - } else if(name.equals(".")) { + } else if (name.equals(".")) { name = DirectoryNode.DOTDIR; } return name; diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java index d52d477176..5e2b9dd4da 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java @@ -39,7 +39,7 @@ public class DirectoryNode extends AbstractFsContentNode { super(dir, directoryBrowseMode); // set name, display name, and icon - if (dir.getDirFlag() == TSK_FS_NAME_FLAG_ENUM.UNALLOC) { + if (dir.isDirNameFlagSet(TSK_FS_NAME_FLAG_ENUM.UNALLOC)) { this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/folder-icon-deleted.png"); } else { this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/Folder-icon.png"); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java index 7ba667cb99..c67965b68c 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java @@ -39,7 +39,7 @@ public class FileNode extends AbstractFsContentNode { super(file, directoryBrowseMode); // set name, display name, and icon - if (file.getDirFlag() == TSK_FS_NAME_FLAG_ENUM.UNALLOC) { + if (file.isDirNameFlagSet(TSK_FS_NAME_FLAG_ENUM.UNALLOC)) { this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon-deleted.png"); } else { this.setIconBaseWithExtension(getIconForFileType(file)); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java index 8513140675..02c7a4a1e0 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java @@ -24,6 +24,7 @@ import java.awt.event.ActionEvent; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -44,9 +45,9 @@ import org.sleuthkit.datamodel.ContentVisitor; import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.FileSystem; import org.sleuthkit.datamodel.Image; -import org.sleuthkit.datamodel.VirtualDirectory; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.VirtualDirectory; import org.sleuthkit.datamodel.Volume; import org.sleuthkit.datamodel.VolumeSystem; @@ -168,22 +169,23 @@ public final class ExtractUnallocAction extends AbstractAction { private List lus = new ArrayList(); private File currentlyProcessing; private int totalSizeinMegs; + long totalBytes = 0; - ExtractUnallocWorker(UnallocStruct us) { - this.lus.add(us); + ExtractUnallocWorker(UnallocStruct us) { //Getting the total megs this worker is going to be doing if (!lockedVols.contains(us.getFileName())) { - totalSizeinMegs = toMb(us.sizeInBytes()); + this.lus.add(us); + totalBytes = us.getSizeInBytes(); + totalSizeinMegs = toMb(totalBytes); lockedVols.add(us.getFileName()); } } ExtractUnallocWorker(List lst) { - //Getting the total megs this worker is going to be doing - long totalBytes = 0; + //Getting the total megs this worker is going to be doing for (UnallocStruct lu : lst) { if (!lockedVols.contains(lu.getFileName())) { - totalBytes += lu.sizeInBytes(); + totalBytes += lu.getSizeInBytes(); lockedVols.add(lu.getFileName()); this.lus.add(lu); } @@ -196,7 +198,7 @@ public final class ExtractUnallocAction extends AbstractAction { if (bytes > 1024 && (bytes / 1024.0) <= Double.MAX_VALUE) { double Mb = ((bytes / 1024.0) / 1024.0);//Bytes -> Megabytes if (Mb <= Integer.MAX_VALUE) { - return (int) Math.floor(Mb); + return (int) Math.ceil(Mb); } } return 0; @@ -222,27 +224,32 @@ public final class ExtractUnallocAction extends AbstractAction { //Begin the actual File IO progress.start(totalSizeinMegs); - int kbs = 0; //Each completion of the while loop adds one to kbs. 8kb * 128 = 1mb. + int kbs = 0; //Each completion of the while loop adds one to kbs. 16kb * 64 = 1mb. int mbs = 0; //Increments every 128th tick of kbs for (UnallocStruct u : this.lus) { currentlyProcessing = u.getFile(); logger.log(Level.INFO, "Writing Unalloc file to " + currentlyProcessing.getPath()); - FileOutputStream fos = new FileOutputStream(currentlyProcessing); - int count = 1; - for (LayoutFile f : u.getLayouts()) { - long offset = 0L; - while (offset != f.getSize() && !canceled) { - offset += f.read(buf, offset, MAX_BYTES); //Offset + Bytes read - fos.write(buf); + OutputStream dos = new FileOutputStream(currentlyProcessing); + long bytes = 0; + int i = 0; + while(i < u.getLayouts().size() && bytes != u.getSizeInBytes()){ + LayoutFile f = u.getLayouts().get(i); + long offsetPerFile = 0L; + int bytesRead; + while(offsetPerFile != f.getSize() && !canceled){ if (++kbs % 128 == 0) { - mbs++; - progress.progress("processing " + mbs + " of " + totalSizeinMegs + " MBs", mbs); + mbs++; + progress.progress("processing " + mbs + " of " + totalSizeinMegs + " MBs", mbs-1); } + bytesRead = f.read(buf, offsetPerFile, MAX_BYTES); + offsetPerFile+= bytesRead; + dos.write(buf, 0, bytesRead); } - count++; + bytes+=f.getSize(); + i++; } - fos.flush(); - fos.close(); + dos.flush(); + dos.close(); if (canceled) { u.getFile().delete(); @@ -420,9 +427,9 @@ public final class ExtractUnallocAction extends AbstractAction { return 0; } if (o1.getId() > o2.getId()) { - return -1; - } else { return 1; + } else { + return -1; } } } @@ -434,6 +441,7 @@ public final class ExtractUnallocAction extends AbstractAction { private class UnallocStruct { private List llf; + private long SizeInBytes; private long VolumeId; private long ImageId; private String ImageName; @@ -453,6 +461,7 @@ public final class ExtractUnallocAction extends AbstractAction { this.ImageName = img.getName(); this.FileName = this.ImageName + "-Unalloc-" + this.ImageId + "-" + 0 + ".dat"; this.FileInstance = new File(Case.getCurrentCase().getCaseDirectory() + File.separator + "Export" + File.separator + this.FileName); + this.SizeInBytes = calcSizeInBytes(); } /** @@ -474,6 +483,7 @@ public final class ExtractUnallocAction extends AbstractAction { this.FileInstance = new File(Case.getCurrentCase().getCaseDirectory() + File.separator + "Export" + File.separator + this.FileName); this.llf = getUnallocFiles(volu); Collections.sort(llf, new SortObjId()); + this.SizeInBytes = calcSizeInBytes(); } //Getters @@ -481,13 +491,17 @@ public final class ExtractUnallocAction extends AbstractAction { return llf.size(); } - long sizeInBytes() { + private long calcSizeInBytes() { long size = 0L; for (LayoutFile f : llf) { size += f.getSize(); } return size; } + + long getSizeInBytes(){ + return this.SizeInBytes; + } long getVolumeId() { return this.VolumeId; diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java b/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java index c9620a4269..4fc9d3cd70 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportBodyFile.java @@ -123,7 +123,7 @@ public class ReportBodyFile implements ReportModule { out.write("|"); out.write(Long.toString(file.getMetaAddr())); out.write("|"); - String modeString = TSK_FS_META_MODE_ENUM.toString(file.getModes(), file.getMetaType()); + String modeString = file.getModesAsString(); if(modeString != null) { out.write(modeString); } diff --git a/KeywordSearch/nbproject/genfiles.properties b/KeywordSearch/nbproject/genfiles.properties index 97886535c8..79d78fbb4b 100644 --- a/KeywordSearch/nbproject/genfiles.properties +++ b/KeywordSearch/nbproject/genfiles.properties @@ -3,6 +3,6 @@ build.xml.script.CRC32=87b97b04 build.xml.stylesheet.CRC32=a56c6a5b@1.46.2 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=8f39548f +nbproject/build-impl.xml.data.CRC32=8af8eb1a nbproject/build-impl.xml.script.CRC32=fe1f48d2 nbproject/build-impl.xml.stylesheet.CRC32=238281d1@2.50.1 diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index b9894f83f5..1764f60bbd 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -25,17 +25,15 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JMenuItem; +import javax.swing.SizeRequirements; import javax.swing.SwingWorker; -import javax.swing.text.AbstractDocument; -import javax.swing.text.AttributeSet; import javax.swing.text.Element; -import javax.swing.text.StyleConstants; import javax.swing.text.View; import javax.swing.text.ViewFactory; -import javax.swing.text.html.HTML; +import javax.swing.text.html.InlineView; +import javax.swing.text.html.ParagraphView; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.HTMLEditorKit.HTMLFactory; import org.netbeans.api.progress.ProgressHandle; @@ -62,25 +60,50 @@ class ExtractedContentPanel extends javax.swing.JPanel { private void customizeComponents() { extractedTextPane.setEditorKit(new HTMLEditorKit() { - ViewFactory viewFactory = new HTMLFactory() { - @Override - public View create(Element elem) { - AttributeSet attrs = elem.getAttributes(); - Object elementName = attrs.getAttribute(AbstractDocument.ElementNameAttribute); - Object o = (elementName != null) ? null : attrs.getAttribute(StyleConstants.NameAttribute); - if (o instanceof HTML.Tag) { - HTML.Tag kind = (HTML.Tag) o; - if (kind == HTML.Tag.IMPLIED) { - return new javax.swing.text.html.ParagraphView(elem); - } - } - return super.create(elem); - } - }; - @Override public ViewFactory getViewFactory() { - return this.viewFactory; + + return new HTMLFactory() { + public View create(Element e) { + View v = super.create(e); + if (v instanceof InlineView) { + return new InlineView(e) { + public int getBreakWeight(int axis, float pos, float len) { + return GoodBreakWeight; + } + + public View breakView(int axis, int p0, float pos, float len) { + if (axis == View.X_AXIS) { + checkPainter(); + int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len); + if (p0 == getStartOffset() && p1 == getEndOffset()) { + return this; + } + return createFragment(p0, p1); + } + return this; + } + }; + } else if (v instanceof ParagraphView) { + return new ParagraphView(e) { + protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) { + if (r == null) { + r = new SizeRequirements(); + } + float pref = layoutPool.getPreferredSpan(axis); + float min = layoutPool.getMinimumSpan(axis); + // Don't include insets, Box.getXXXSpan will include them. + r.minimum = (int) min; + r.preferred = Math.max(r.minimum, (int) pref); + r.maximum = Integer.MAX_VALUE; + r.alignment = 0.5f; + return r; + } + }; + } + return v; + } + }; } }); diff --git a/RecentActivity/nbproject/genfiles.properties b/RecentActivity/nbproject/genfiles.properties index fe69d96298..69ec9bf285 100644 --- a/RecentActivity/nbproject/genfiles.properties +++ b/RecentActivity/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=bcfe7e87 +build.xml.data.CRC32=11199bf7 build.xml.script.CRC32=d323407a build.xml.stylesheet.CRC32=a56c6a5b@2.50.1 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=bcfe7e87 +nbproject/build-impl.xml.data.CRC32=11199bf7 nbproject/build-impl.xml.script.CRC32=aef16a21 nbproject/build-impl.xml.stylesheet.CRC32=238281d1@2.50.1