diff --git a/Core/manifest.mf b/Core/manifest.mf index dbfb89dc59..494ba39afc 100644 --- a/Core/manifest.mf +++ b/Core/manifest.mf @@ -2,7 +2,7 @@ Manifest-Version: 1.0 OpenIDE-Module: org.sleuthkit.autopsy.core/10 OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml -OpenIDE-Module-Implementation-Version: 29 +OpenIDE-Module-Implementation-Version: 30 OpenIDE-Module-Requires: org.openide.windows.WindowManager AutoUpdate-Show-In-Client: true AutoUpdate-Essential-Module: true diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties index c269acaa98..c01abc4855 100644 --- a/Core/nbproject/project.properties +++ b/Core/nbproject/project.properties @@ -127,5 +127,5 @@ nbm.homepage=http://www.sleuthkit.org/ nbm.module.author=Brian Carrier nbm.needs.restart=true source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar -spec.version.base=10.17 +spec.version.base=10.18 diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSummary.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSummary.java index 5fc7ae8aa7..5c14125d87 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSummary.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSummary.java @@ -18,16 +18,21 @@ */ package org.sleuthkit.autopsy.communications.relationships; +import com.google.gson.Gson; +import java.util.Collection; import java.util.List; import java.util.Set; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.blackboardutils.FileAttachment; +import org.sleuthkit.datamodel.blackboardutils.MessageAttachments; /** * @@ -121,10 +126,29 @@ class AccountSummary { } } try { - attachmentCnt += artifact.getChildrenCount(); - for (Content childContent : artifact.getChildren()) { - if (ImageUtils.thumbnailSupported(childContent)) { - mediaCnt++; + // count the attachments from the TSK_ATTACHMENTS attribute. + BlackboardAttribute attachmentsAttr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ATTACHMENTS)); + if (attachmentsAttr != null) { + String jsonVal = attachmentsAttr.getValueString(); + MessageAttachments msgAttachments = new Gson().fromJson(jsonVal, MessageAttachments.class); + + Collection fileAttachments = msgAttachments.getFileAttachments(); + for (FileAttachment fileAttachment : fileAttachments) { + attachmentCnt++; + long attachedFileObjId = fileAttachment.getObjectId(); + if (attachedFileObjId >= 0) { + AbstractFile attachedFile = artifact.getSleuthkitCase().getAbstractFileById(attachedFileObjId); + if (ImageUtils.thumbnailSupported(attachedFile)) { + mediaCnt++; + } + } + } + } else { // backward compatibility - email message attachments are derived files, children of the message. + attachmentCnt += artifact.getChildrenCount(); + for (Content childContent : artifact.getChildren()) { + if (ImageUtils.thumbnailSupported(childContent)) { + mediaCnt++; + } } } } catch (TskCoreException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties index b3a384ce48..cf07682e5d 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties @@ -87,9 +87,9 @@ HtmlPanel.showImagesToggleButton.text=Download Images MediaViewImagePanel.tagsMenu.text_1=Tags Menu MediaPlayerPanel.progressLabel.text=00:00:00/00:00:00 MediaPlayerPanel.audioSlider.toolTipText= -MediaPlayerPanel.rewindButton.text=\u2bc7\u2bc7 -MediaPlayerPanel.fastForwardButton.text=\u2bc8\u2bc8 -MediaPlayerPanel.playButton.text=\u25ba +MediaPlayerPanel.rewindButton.text= +MediaPlayerPanel.fastForwardButton.text= +MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 2d9df0ae33..13f3ef0710 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -158,9 +158,9 @@ HtmlPanel.showImagesToggleButton.text=Download Images MediaViewImagePanel.tagsMenu.text_1=Tags Menu MediaPlayerPanel.progressLabel.text=00:00:00/00:00:00 MediaPlayerPanel.audioSlider.toolTipText= -MediaPlayerPanel.rewindButton.text=\u2bc7\u2bc7 -MediaPlayerPanel.fastForwardButton.text=\u2bc8\u2bc8 -MediaPlayerPanel.playButton.text=\u25ba +MediaPlayerPanel.rewindButton.text= +MediaPlayerPanel.fastForwardButton.text= +MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form index d8433a907b..3cf845e2d0 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form @@ -41,7 +41,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -123,9 +123,21 @@ + + + + + + + + + + + + @@ -138,6 +150,9 @@ + + + @@ -153,6 +168,9 @@ + + + @@ -172,6 +190,15 @@ + + + + + + + + + @@ -188,12 +215,16 @@ + + + - + - + + @@ -223,7 +254,7 @@ - + @@ -233,12 +264,15 @@ - - - - + + + + + + + - + @@ -260,14 +294,15 @@ - + - + - + + @@ -281,6 +316,15 @@ + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java index 9ed6727388..e1d4646a2f 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java @@ -61,6 +61,7 @@ import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.TskData; import javafx.embed.swing.JFXPanel; +import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JSlider; import javax.swing.SwingUtilities; @@ -201,6 +202,9 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie private static final int PROGRESS_SLIDER_SIZE = 2000; private static final int SKIP_IN_SECONDS = 30; + private final ImageIcon playIcon = new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/contentviewers/images/Play-arrow-01.png")); + private final ImageIcon pauseIcon = new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/contentviewers/images/Pause-01.png")); + private ExtractMedia extractMediaWorker; //Serialize setting the value of the Video progress slider. @@ -217,12 +221,12 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie //True for fairness. In other words, //acquire() calls are processed in order of invocation. sliderLock = new Semaphore(1, true); - + /** * See JIRA-5888 for details. Initializing gstreamer here is more stable * on Windows. */ - if(PlatformUtil.isWindowsOS()) { + if (PlatformUtil.isWindowsOS()) { Gst.init(); } } @@ -280,11 +284,11 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie public void stateChanged(GstObject go, State oldState, State currentState, State pendingState) { if (State.PLAYING.equals(currentState)) { SwingUtilities.invokeLater(() -> { - playButton.setText("||"); + playButton.setIcon(pauseIcon); }); } else { SwingUtilities.invokeLater(() -> { - playButton.setText("►"); + playButton.setIcon(playIcon); }); } } @@ -514,7 +518,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie // Initialize Gstreamer. It is safe to call this for every file. // It was moved here from the constructor because having it happen // earlier resulted in conflicts on Linux. See JIRA-5888. - if(!PlatformUtil.isWindowsOS()) { + if (!PlatformUtil.isWindowsOS()) { Gst.init(); } @@ -821,7 +825,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie ); videoPanelLayout.setVerticalGroup( videoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 131, Short.MAX_VALUE) + .addGap(0, 117, Short.MAX_VALUE) ); progressSlider.setValue(0); @@ -835,7 +839,11 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie buttonPanel.setLayout(new java.awt.GridBagLayout()); + playButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/contentviewers/images/Play-arrow-01.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(playButton, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.playButton.text")); // NOI18N + playButton.setMaximumSize(new java.awt.Dimension(53, 29)); + playButton.setMinimumSize(new java.awt.Dimension(53, 29)); + playButton.setPreferredSize(new java.awt.Dimension(49, 29)); playButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { playButtonActionPerformed(evt); @@ -849,6 +857,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie gridBagConstraints.insets = new java.awt.Insets(5, 6, 0, 0); buttonPanel.add(playButton, gridBagConstraints); + fastForwardButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/contentviewers/images/Fast-forward-01.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(fastForwardButton, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.fastForwardButton.text")); // NOI18N fastForwardButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -862,6 +871,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie gridBagConstraints.insets = new java.awt.Insets(5, 6, 0, 0); buttonPanel.add(fastForwardButton, gridBagConstraints); + rewindButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/contentviewers/images/Fast-rewind-01.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(rewindButton, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.rewindButton.text")); // NOI18N rewindButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -877,6 +887,9 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie org.openide.awt.Mnemonics.setLocalizedText(VolumeIcon, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.VolumeIcon.text")); // NOI18N VolumeIcon.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); + VolumeIcon.setMaximumSize(new java.awt.Dimension(34, 29)); + VolumeIcon.setMinimumSize(new java.awt.Dimension(34, 29)); + VolumeIcon.setPreferredSize(new java.awt.Dimension(34, 19)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; @@ -891,8 +904,10 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie audioSlider.setMinorTickSpacing(5); audioSlider.setToolTipText(org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.audioSlider.toolTipText")); // NOI18N audioSlider.setValue(25); - audioSlider.setMinimumSize(new java.awt.Dimension(200, 21)); - audioSlider.setPreferredSize(new java.awt.Dimension(200, 21)); + audioSlider.setMaximumSize(new java.awt.Dimension(32767, 19)); + audioSlider.setMinimumSize(new java.awt.Dimension(200, 19)); + audioSlider.setPreferredSize(new java.awt.Dimension(200, 30)); + audioSlider.setRequestFocusEnabled(false); audioSlider.setUI(new CircularJSliderUI(audioSlider, new CircularJSliderConfiguration(new Dimension(15,15)))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; @@ -909,9 +924,10 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie playBackSpeedComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "0.25x", "0.50x", "0.75x", "1x", "1.25x", "1.50x", "1.75x", "2x" })); playBackSpeedComboBox.setSelectedIndex(3); - playBackSpeedComboBox.setMaximumSize(new java.awt.Dimension(53, 23)); - playBackSpeedComboBox.setMinimumSize(new java.awt.Dimension(53, 23)); - playBackSpeedComboBox.setPreferredSize(new java.awt.Dimension(53, 23)); + playBackSpeedComboBox.setMaximumSize(new java.awt.Dimension(53, 29)); + playBackSpeedComboBox.setMinimumSize(new java.awt.Dimension(53, 29)); + playBackSpeedComboBox.setPreferredSize(new java.awt.Dimension(53, 29)); + playBackSpeedComboBox.setRequestFocusEnabled(false); playBackSpeedComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { playBackSpeedComboBoxActionPerformed(evt); @@ -919,13 +935,16 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie }); org.openide.awt.Mnemonics.setLocalizedText(playBackSpeedLabel, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.playBackSpeedLabel.text")); // NOI18N + playBackSpeedLabel.setMaximumSize(new java.awt.Dimension(34, 19)); + playBackSpeedLabel.setMinimumSize(new java.awt.Dimension(34, 19)); + playBackSpeedLabel.setPreferredSize(new java.awt.Dimension(34, 19)); javax.swing.GroupLayout playBackPanelLayout = new javax.swing.GroupLayout(playBackPanel); playBackPanel.setLayout(playBackPanelLayout); playBackPanelLayout.setHorizontalGroup( playBackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(playBackPanelLayout.createSequentialGroup() - .addComponent(playBackSpeedLabel) + .addComponent(playBackSpeedLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(playBackSpeedComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(13, 13, 13)) @@ -933,11 +952,13 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie playBackPanelLayout.setVerticalGroup( playBackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(playBackPanelLayout.createSequentialGroup() - .addGap(6, 6, 6) - .addGroup(playBackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(playBackSpeedComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(playBackSpeedLabel)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(7, 7, 7) + .addGroup(playBackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(playBackPanelLayout.createSequentialGroup() + .addGap(2, 2, 2) + .addComponent(playBackSpeedLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(playBackSpeedComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10)) ); javax.swing.GroupLayout controlPanelLayout = new javax.swing.GroupLayout(controlPanel); @@ -969,7 +990,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie .addGap(5, 5, 5) .addGroup(controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(buttonPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(playBackPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) + .addComponent(playBackPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(14, 14, 14) .addComponent(infoLabel)) ); diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-forward-01.png b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-forward-01.png new file mode 100755 index 0000000000..8261b2962a Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-forward-01.png differ diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-rewind-01.png b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-rewind-01.png new file mode 100755 index 0000000000..a941bae845 Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Fast-rewind-01.png differ diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/images/Pause-01.png b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Pause-01.png new file mode 100755 index 0000000000..8f3db42f5b Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Pause-01.png differ diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/images/Play-arrow-01.png b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Play-arrow-01.png new file mode 100755 index 0000000000..624c1841d8 Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/contentviewers/images/Play-arrow-01.png differ diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java index 93d17b21bb..a260d2066f 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java @@ -47,7 +47,7 @@ final class FileSearchData { UNIQUE(0, 1, Bundle.FileSearchData_Frequency_unique_displayName()), RARE(1, 10, Bundle.FileSearchData_Frequency_rare_displayName()), COMMON(2, 100, Bundle.FileSearchData_Frequency_common_displayName()), - VERY_COMMON(3, 0, Bundle.FileSearchData_Frequency_common_displayName()), + VERY_COMMON(3, 0, Bundle.FileSearchData_Frequency_verycommon_displayName()), KNOWN(4, 0, Bundle.FileSearchData_Frequency_known_displayName()), UNKNOWN(5, 0, Bundle.FileSearchData_Frequency_unknown_displayName()); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form index c8a68294e2..ead4b9f264 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form @@ -404,15 +404,6 @@ - - - - - - - - - @@ -457,12 +448,6 @@ - - - - - - @@ -573,12 +558,6 @@ - - - - - - @@ -631,12 +610,6 @@ - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index d751911379..f81d3d1945 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -1328,9 +1328,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener parentList.setModel(new DefaultListModel()); parentList.setEnabled(false); - parentList.setMaximumSize(null); - parentList.setMinimumSize(new java.awt.Dimension(0, 30)); - parentList.setPreferredSize(new java.awt.Dimension(0, 30)); parentList.setVisibleRowCount(4); parentList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { @@ -1366,8 +1363,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener hashSetList.setModel(new DefaultListModel()); hashSetList.setEnabled(false); - hashSetList.setMinimumSize(new java.awt.Dimension(0, 30)); - hashSetList.setPreferredSize(new java.awt.Dimension(0, 30)); hashSetList.setVisibleRowCount(3); hashSetScrollPane.setViewportView(hashSetList); @@ -1454,8 +1449,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener objectsList.setModel(new DefaultListModel()); objectsList.setEnabled(false); - objectsList.setMinimumSize(new java.awt.Dimension(0, 30)); - objectsList.setPreferredSize(new java.awt.Dimension(0, 30)); objectsList.setVisibleRowCount(2); objectsScrollPane.setViewportView(objectsList); @@ -1487,8 +1480,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener interestingItemsList.setModel(new DefaultListModel()); interestingItemsList.setEnabled(false); - interestingItemsList.setMinimumSize(new java.awt.Dimension(0, 30)); - interestingItemsList.setPreferredSize(new java.awt.Dimension(0, 30)); interestingItemsList.setVisibleRowCount(2); interestingItemsScrollPane.setViewportView(interestingItemsList); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form index c21dca33e5..c7d9f2b4ee 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form @@ -290,11 +290,11 @@ - + - + @@ -331,9 +331,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java index b5bbca49f5..eaeb0b3c06 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java @@ -496,7 +496,6 @@ public class ResultsPanel extends javax.swing.JPanel { instancesList.setModel(instancesListModel); instancesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); instancesList.setCellRenderer(new InstancesCellRenderer()); - instancesList.setPreferredSize(new java.awt.Dimension(0, 50)); instancesList.setVisibleRowCount(2); instancesScrollPane.setViewportView(instancesList); @@ -510,11 +509,11 @@ public class ResultsPanel extends javax.swing.JPanel { ); instancesPanelLayout.setVerticalGroup( instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 221, Short.MAX_VALUE) + .addGap(0, 68, Short.MAX_VALUE) .addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, instancesPanelLayout.createSequentialGroup() .addGap(0, 0, 0) - .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 221, Short.MAX_VALUE))) + .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) ); resultsSplitPane.setRightComponent(instancesPanel); diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties index 1831874d40..5d1d27b060 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties @@ -16,7 +16,6 @@ EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=Possib EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=Compression ratio is {0}, skipping items in {1}. EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=Possible ZIP bomb detected: {0} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=The archive is {0} levels deep, skipping processing of {1} -EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=Unknown item path in archive: {0}, will use: {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=Not enough disk space to unpack archive item: {0}, {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=The archive item is too large to unpack, skipping unpacking this item. EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg=Error unpacking {0} diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties index 355c94be83..d032b4f3d1 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties @@ -28,7 +28,6 @@ EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=\u30a2 EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=\u5727\u7e2e\u7387\u306f {0} \u3067\u3059\u3002{1} \u306e\u9805\u76ee\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002 EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=ZIP\u7206\u5f3e\u304c\u691c\u51fa\u3055\u308c\u305f\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059: {0} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=\u30a2\u30fc\u30ab\u30a4\u30d6\u306f {0} \u30ec\u30d9\u30eb\u306e\u6df1\u3055\u3067\u3059\u3002{1} \u306e\u51e6\u7406\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059 -EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u4e0d\u660e\u306a\u9805\u76ee\u30d1\u30b9: {0}\u3001\u6b21\u3092\u4f7f\u7528\u3057\u307e\u3059: {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u9805\u76ee\u3092\u958b\u5c01\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093: {0}\u3001{1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=\u30a2\u30fc\u30ab\u30a4\u30d6\u9805\u76ee\u304c\u5927\u304d\u3059\u304e\u3067\u958b\u5c01\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u306e\u9805\u76ee\u306e\u958b\u5c01\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002 EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg={0} \u306e\u958b\u5c01\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java index e6ad5ee750..fca75c2c56 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java @@ -449,10 +449,6 @@ class SevenZipExtractor { } else { pathInArchive = "/" + useName; } - String msg = NbBundle.getMessage(SevenZipExtractor.class, - "EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg", - getArchiveFilePath(archiveFile), pathInArchive); - logger.log(Level.WARNING, msg); } return pathInArchive; } diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml index c6e222b422..90fbce3d76 100644 --- a/Experimental/nbproject/project.xml +++ b/Experimental/nbproject/project.xml @@ -135,7 +135,7 @@ 10 - 10.17 + 10.18 diff --git a/ImageGallery/nbproject/project.xml b/ImageGallery/nbproject/project.xml index 634ed81534..a7157df475 100644 --- a/ImageGallery/nbproject/project.xml +++ b/ImageGallery/nbproject/project.xml @@ -127,7 +127,7 @@ 10 - 10.17 + 10.18 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java index bae9894de9..f634e8387d 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java @@ -2150,10 +2150,15 @@ public final class DrawableDB { public void deleteDataSource(long dataSourceID) throws SQLException, TskCoreException { dbWriteLock(); DrawableTransaction trans = null; + String whereClause = "WHERE data_source_obj_id = " + dataSourceID; + String tableName = "image_gallery_groups"; try { trans = beginTransaction(); deleteDataSourceStmt.setLong(1, dataSourceID); deleteDataSourceStmt.executeUpdate(); + if (caseDb.getCaseDbAccessManager().tableExists(tableName)) { + caseDb.getCaseDbAccessManager().delete(tableName, whereClause); + } commitTransaction(trans, true); } catch (SQLException | TskCoreException ex) { if (null != trans) { diff --git a/KeywordSearch/nbproject/project.xml b/KeywordSearch/nbproject/project.xml index 78b0b2626a..25e05e30fa 100644 --- a/KeywordSearch/nbproject/project.xml +++ b/KeywordSearch/nbproject/project.xml @@ -119,7 +119,7 @@ 10 - 10.17 + 10.18 diff --git a/NEWS.txt b/NEWS.txt index 7a4487417d..ee294d7fea 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,3 +1,36 @@ +---------------- VERSION 4.14.0 -------------- +Specialized UIs: +- New File Discovery UI that allows you to search and filter for certain types of files. +- New Map viewer that uses either Bing (when online) or offline map tiles. +- Communications UI shows country names for phone numbers and fixed bug in summary panel. +- Fixed bugs in timeline filtering. +- Refactored backend timeline filtering code based on The Sleuth Kit datamodel changes to remove JavaFX dependency. + +Data Sources: +- Added limited support for APFS disk images. Does not include encrypted volumes or ones that span multiple disks. Uses contribution to The Sleuth Kit from Blackbag Technologies. +- New data source processor that parses “XRY File Exports”. + +Content Viewers: +- Added a new “Context” viewer to show where a file came from. Currently shows what message a file was attached to or what URL a file was downloaded from. +- Added support to seek and change playback speed for videos in “Application” viewer. +- Improved support for Unicode HTML files in “Application” viewer. +- Added support for webp image files in “Application” viewer. + +Ingest Modules: +- Keyword Search module uses Decodetect statistical encoding detection for plain text files. Fixes issues with incorrect detection of Japanese files. +- Embedded File Extractor module uses statistical analysis to determine encoding of file names in ZIP files. Fixes issues with ZIP files created on Windows Japanese computers. +- Solr (Keyword Search module) now uses Japanese-specific tokenization using Kuromoji. +- Fixed Shellbags module in RegRipper (used by Autopsy Recent Activity module) to fix parsing errors. +- Plaso module no longer generates an error if enabled for non-disk image data sources. +- Added support for message attachments that are stored as an external file system file. Expanded Email and Android modules to use this technique. + +General: +- Fixed crashes by gstreamer when a video is selected. +- Added initial capability to delete a data source from a case (excludes data in the CR). +- Changed behavior of portable case menu item to automatically open the case and warn if it was already unpacked. +- Fixed bug that caused issues when case metadata had Unicode values. +- Added new Attachment APIs to the CommunicationsArtifactHelper class to support attachments stored as external file system files. + ---------------- VERSION 4.13.0 -------------- General: - Switch from Oracle JDK to OpenJDK. diff --git a/RecentActivity/nbproject/project.xml b/RecentActivity/nbproject/project.xml index 29b5d1362a..89394f1b1f 100644 --- a/RecentActivity/nbproject/project.xml +++ b/RecentActivity/nbproject/project.xml @@ -60,7 +60,7 @@ 10 - 10.17 + 10.18 diff --git a/Testing/nbproject/project.xml b/Testing/nbproject/project.xml index 41dc8b253e..def60a06ac 100644 --- a/Testing/nbproject/project.xml +++ b/Testing/nbproject/project.xml @@ -47,7 +47,7 @@ 10 - 10.17 + 10.18 diff --git a/docs/doxygen-user/Doxyfile b/docs/doxygen-user/Doxyfile index 1bb3773a70..8295d9df5a 100644 --- a/docs/doxygen-user/Doxyfile +++ b/docs/doxygen-user/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Autopsy User Documentation" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 4.13.0 +PROJECT_NUMBER = 4.14.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -1025,7 +1025,7 @@ GENERATE_HTML = YES # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_OUTPUT = 4.13.0 +HTML_OUTPUT = 4.14.0 # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index d73868792a..dd78bc69ea 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Autopsy" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 4.13.0 +PROJECT_NUMBER = 4.14.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears a the top of each page and should give viewer a @@ -1066,7 +1066,7 @@ GENERATE_HTML = YES # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_OUTPUT = api-docs/4.13.0/ +HTML_OUTPUT = api-docs/4.14.0/ # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). diff --git a/nbproject/project.properties b/nbproject/project.properties index 8132096d48..1f61a9c967 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -4,7 +4,7 @@ app.title=Autopsy ### lowercase version of above app.name=${branding.token} ### if left unset, version will default to today's date -app.version=4.13.0 +app.version=4.14.0 ### build.type must be one of: DEVELOPMENT, RELEASE #build.type=RELEASE build.type=DEVELOPMENT diff --git a/thirdparty/rr-full/Parse/Win32Registry/Base.pm b/thirdparty/rr-full/Parse/Win32Registry/Base.pm index 6598f37b11..0b206e7bb5 100644 --- a/thirdparty/rr-full/Parse/Win32Registry/Base.pm +++ b/thirdparty/rr-full/Parse/Win32Registry/Base.pm @@ -161,14 +161,26 @@ sub unpack_windows_time { # The equation can be found in several places on the Net. # My thanks go to Dan Sully for Audio::WMA's _fileTimeToUnixTime # which shows a perl implementation of it. - my ($low, $high) = unpack("VV", $data); - my $filetime = $high * 2 ** 32 + $low; - my $epoch_time = int(($filetime - 116444736000000000) / 10000000); + my ($lo, $hi) = unpack("VV", $data); +# my $filetime = $high * 2 ** 32 + $low; +# my $epoch_time = int(($filetime - 116444736000000000) / 10000000); + + my $epoch_time; + if ($lo == 0 && $hi == 0) { + $epoch_time = 0; + } else { + $lo -= 0xd53e8000; + $hi -= 0x019db1de; + $epoch_time = int($hi*429.4967296 + $lo/1e7); + }; + $epoch_time = 0 if ($epoch_time < 0); + + # adjust the UNIX epoch time to the local OS's epoch time # (see perlport's Time and Date section) - my $epoch_offset = timegm(0, 0, 0, 1, 0, 70); - $epoch_time += $epoch_offset; + # my $epoch_offset = timegm(0, 0, 0, 1, 0, 70); + # $epoch_time += $epoch_offset; if ($epoch_time < 0 || $epoch_time > 0x7fffffff) { $epoch_time = undef; diff --git a/thirdparty/rr-full/rip.exe b/thirdparty/rr-full/rip.exe index 2becc8de6b..9a024202f3 100755 Binary files a/thirdparty/rr-full/rip.exe and b/thirdparty/rr-full/rip.exe differ diff --git a/thirdparty/rr-full/rr.exe b/thirdparty/rr-full/rr.exe index a96bba5daa..889b971889 100755 Binary files a/thirdparty/rr-full/rr.exe and b/thirdparty/rr-full/rr.exe differ diff --git a/thirdparty/rr/Parse/Win32Registry/Base.pm b/thirdparty/rr/Parse/Win32Registry/Base.pm index 6598f37b11..0b206e7bb5 100644 --- a/thirdparty/rr/Parse/Win32Registry/Base.pm +++ b/thirdparty/rr/Parse/Win32Registry/Base.pm @@ -161,14 +161,26 @@ sub unpack_windows_time { # The equation can be found in several places on the Net. # My thanks go to Dan Sully for Audio::WMA's _fileTimeToUnixTime # which shows a perl implementation of it. - my ($low, $high) = unpack("VV", $data); - my $filetime = $high * 2 ** 32 + $low; - my $epoch_time = int(($filetime - 116444736000000000) / 10000000); + my ($lo, $hi) = unpack("VV", $data); +# my $filetime = $high * 2 ** 32 + $low; +# my $epoch_time = int(($filetime - 116444736000000000) / 10000000); + + my $epoch_time; + if ($lo == 0 && $hi == 0) { + $epoch_time = 0; + } else { + $lo -= 0xd53e8000; + $hi -= 0x019db1de; + $epoch_time = int($hi*429.4967296 + $lo/1e7); + }; + $epoch_time = 0 if ($epoch_time < 0); + + # adjust the UNIX epoch time to the local OS's epoch time # (see perlport's Time and Date section) - my $epoch_offset = timegm(0, 0, 0, 1, 0, 70); - $epoch_time += $epoch_offset; + # my $epoch_offset = timegm(0, 0, 0, 1, 0, 70); + # $epoch_time += $epoch_offset; if ($epoch_time < 0 || $epoch_time > 0x7fffffff) { $epoch_time = undef; diff --git a/thirdparty/rr/rip.exe b/thirdparty/rr/rip.exe index 2becc8de6b..9a024202f3 100755 Binary files a/thirdparty/rr/rip.exe and b/thirdparty/rr/rip.exe differ diff --git a/thirdparty/rr/rr.exe b/thirdparty/rr/rr.exe index a96bba5daa..889b971889 100755 Binary files a/thirdparty/rr/rr.exe and b/thirdparty/rr/rr.exe differ diff --git a/thunderbirdparser/nbproject/project.xml b/thunderbirdparser/nbproject/project.xml index 52e915e2f3..4eebb3d2f4 100644 --- a/thunderbirdparser/nbproject/project.xml +++ b/thunderbirdparser/nbproject/project.xml @@ -36,7 +36,7 @@ 10 - 10.17 + 10.18