From 79f93a4cbdcda7f893c7e643757dc76c24688a1a Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 10 Jun 2021 08:32:54 -0400 Subject: [PATCH 01/33] moving settings --- .../autopsy/keywordsearch/Bundle.properties | 5 +- .../keywordsearch/Bundle_ja.properties | 2 +- ...eywordSearchGlobalSearchSettingsPanel.form | 69 ++++------- ...eywordSearchGlobalSearchSettingsPanel.java | 82 +++---------- .../KeywordSearchJobSettings.java | 62 ++++++++++ .../KeywordSearchJobSettingsPanel.form | 88 +++++++++++--- .../KeywordSearchJobSettingsPanel.java | 115 +++++++++++++++--- 7 files changed, 271 insertions(+), 152 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index 7dfee92048..f7464526cb 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -319,5 +319,6 @@ ExtractedContentPanel.pageTotalLabel.text=- ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: -KeywordSearchGlobalSearchSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) -KeywordSearchGlobalSearchSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) +KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.ocrOnly.text=Do OCR only diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties index d43448a582..8c8fbea618 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties @@ -200,7 +200,6 @@ KeywordSearchGlobalSearchSettingsPanel.filesIndexedValue.text=0 KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306e\u7d50\u679c\u66f4\u65b0\u983b\u5ea6\: KeywordSearchGlobalSearchSettingsPanel.informationLabel.text=\u60c5\u5831 KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 -KeywordSearchGlobalSearchSettingsPanel.ocrCheckBox.text=OCR\u6587\u5b57\u8a8d\u8b58\u3092\u6709\u52b9\u306b\u3059\u308b KeywordSearchGlobalSearchSettingsPanel.settingsLabel.text=\u8a2d\u5b9a KeywordSearchGlobalSearchSettingsPanel.showSnippetsCB.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u306b\u30ad\u30fc\u30ef\u30fc\u30c9\u30d7\u30ec\u30d3\u30e5\u30fc\u3092\u8868\u793a(\u691c\u7d22\u6642\u9593\u304c\u9577\u304f\u306a\u308a\u307e\u3059) KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306bNSRL(\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb)\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30ad\u30fc\u30ef\u30fc\u30c9\u306b\u8ffd\u52a0\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044 @@ -370,3 +369,4 @@ SolrSearchService.exceptionMessage.noCurrentSolrCore=IndexMetadata\u306b\u306f\u SolrSearchService.exceptionMessage.noIndexMetadata=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u304b\u3089\u6b21\u306eIndexMetaData\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\: {0} SolrSearchService.exceptionMessage.unableToDeleteCollection=\u30b3\u30ec\u30af\u30b7\u30e7\u30f3{0}\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093 TextZoomPanel.zoomResetButton.text=\u30ea\u30bb\u30c3\u30c8 +KeywordSearchJobSettingsPanel.ocrCheckBox.text=OCR\u6587\u5b57\u8a8d\u8b58\u3092\u6709\u52b9\u306b\u3059\u308b diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form index 550ad5d442..4a0cadaefd 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.form @@ -23,25 +23,25 @@ - + - - - - - + + + + + + + + - + - - - @@ -49,7 +49,12 @@ - + + + + + + @@ -58,22 +63,18 @@ - - - - - - - - - - + + + + + + + - @@ -90,10 +91,6 @@ - - - - @@ -279,25 +276,5 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java index b9687a32c2..ccd1de71da 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSearchSettingsPanel.java @@ -50,13 +50,9 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen private void activateWidgets() { skipNSRLCheckBox.setSelected(KeywordSearchSettings.getSkipKnown()); showSnippetsCB.setSelected(KeywordSearchSettings.getShowSnippets()); - ocrCheckBox.setSelected(KeywordSearchSettings.getOcrOption()); - limitedOcrCheckbox.setSelected(KeywordSearchSettings.getLimitedOcrOption()); boolean ingestRunning = IngestManager.getInstance().isIngestRunning(); ingestWarningLabel.setVisible(ingestRunning); skipNSRLCheckBox.setEnabled(!ingestRunning); - ocrCheckBox.setEnabled(!ingestRunning); - limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected() && !ingestRunning); setTimeSettingEnabled(!ingestRunning); final UpdateFrequency curFreq = KeywordSearchSettings.getUpdateFrequency(); @@ -111,8 +107,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen showSnippetsCB = new javax.swing.JCheckBox(); timeRadioButton5 = new javax.swing.JRadioButton(); ingestWarningLabel = new javax.swing.JLabel(); - ocrCheckBox = new javax.swing.JCheckBox(); - limitedOcrCheckbox = new javax.swing.JCheckBox(); skipNSRLCheckBox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchGlobalSearchSettingsPanel.class, "KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text")); // NOI18N skipNSRLCheckBox.setToolTipText(org.openide.util.NbBundle.getMessage(KeywordSearchGlobalSearchSettingsPanel.class, "KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.toolTipText")); // NOI18N @@ -186,20 +180,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen ingestWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); // NOI18N ingestWarningLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchGlobalSearchSettingsPanel.class, "KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text")); // NOI18N - ocrCheckBox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchGlobalSearchSettingsPanel.class, "KeywordSearchGlobalSearchSettingsPanel.ocrCheckBox.text")); // NOI18N - ocrCheckBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - ocrCheckBoxActionPerformed(evt); - } - }); - - limitedOcrCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchGlobalSearchSettingsPanel.class, "KeywordSearchGlobalSearchSettingsPanel.limitedOcrCheckbox.text")); // NOI18N - limitedOcrCheckbox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - limitedOcrCheckboxActionPerformed(evt); - } - }); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -207,13 +187,15 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ingestWarningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGap(16, 16, 16) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(skipNSRLCheckBox) + .addComponent(showSnippetsCB)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(settingsLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(settingsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 326, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(ingestWarningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(informationLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -221,14 +203,15 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen .addGroup(layout.createSequentialGroup() .addGap(16, 16, 16) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(skipNSRLCheckBox) - .addComponent(showSnippetsCB) - .addComponent(ocrCheckBox) .addGroup(layout.createSequentialGroup() .addComponent(filesIndexedLabel) .addGap(18, 18, 18) .addComponent(filesIndexedValue)) .addComponent(frequencyLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(chunksLabel) + .addGap(18, 18, 18) + .addComponent(chunksValLabel)) .addGroup(layout.createSequentialGroup() .addGap(16, 16, 16) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -236,16 +219,13 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen .addComponent(timeRadioButton1) .addComponent(timeRadioButton3) .addComponent(timeRadioButton4) - .addComponent(timeRadioButton5))) - .addGroup(layout.createSequentialGroup() - .addComponent(chunksLabel) - .addGap(18, 18, 18) - .addComponent(chunksValLabel)) - .addGroup(layout.createSequentialGroup() - .addGap(16, 16, 16) - .addComponent(limitedOcrCheckbox))))) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) + .addComponent(timeRadioButton5)))))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(settingsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(settingsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 326, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {chunksLabel, filesIndexedLabel}); @@ -262,10 +242,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(showSnippetsCB) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ocrCheckBox) - .addGap(0, 0, 0) - .addComponent(limitedOcrCheckbox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(frequencyLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(timeRadioButton1) @@ -323,15 +299,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); }//GEN-LAST:event_timeRadioButton4ActionPerformed - private void ocrCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrCheckBoxActionPerformed - limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected()); - firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); - }//GEN-LAST:event_ocrCheckBoxActionPerformed - - private void limitedOcrCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_limitedOcrCheckboxActionPerformed - firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); - }//GEN-LAST:event_limitedOcrCheckboxActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel chunksLabel; private javax.swing.JLabel chunksValLabel; @@ -341,8 +308,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen private javax.swing.JLabel informationLabel; private javax.swing.JSeparator informationSeparator; private javax.swing.JLabel ingestWarningLabel; - private javax.swing.JCheckBox limitedOcrCheckbox; - private javax.swing.JCheckBox ocrCheckBox; private javax.swing.JLabel settingsLabel; private javax.swing.JSeparator settingsSeparator; private javax.swing.JCheckBox showSnippetsCB; @@ -360,8 +325,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen KeywordSearchSettings.setSkipKnown(skipNSRLCheckBox.isSelected()); KeywordSearchSettings.setUpdateFrequency(getSelectedTimeValue()); KeywordSearchSettings.setShowSnippets(showSnippetsCB.isSelected()); - KeywordSearchSettings.setOcrOption(ocrCheckBox.isSelected()); - KeywordSearchSettings.setLimitedOcrOption(limitedOcrCheckbox.isSelected()); } @Override @@ -412,15 +375,6 @@ class KeywordSearchGlobalSearchSettingsPanel extends javax.swing.JPanel implemen logger.log(Level.WARNING, "Could not get number of indexed files/chunks"); //NON-NLS } - if (!PlatformUtil.isWindowsOS() || !PlatformUtil.is64BitOS()) { - ocrCheckBox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsOCR()); - ocrCheckBox.setSelected(false); - ocrCheckBox.setEnabled(false); - limitedOcrCheckbox.setSelected(false); - limitedOcrCheckbox.setEnabled(false); - limitedOcrCheckbox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsLimitedOCR()); - } - KeywordSearch.addNumIndexedFilesChangeListener( new PropertyChangeListener() { @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index 8ad969863b..7b81298c9c 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -32,6 +32,10 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { private HashSet namesOfEnabledKeywordLists; private HashSet namesOfDisabledKeywordLists; // Added in version 1.1 + private boolean OCREnabled; + private boolean limitedOCREnabled; + private boolean OCROnly; + /** * Constructs ingest job settings for the keywords search module. * @@ -52,6 +56,64 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { this.namesOfDisabledKeywordLists = new HashSet<>(namesOfDisabledKeywordLists); } + /** + * Whether or not OCR is enabled for keyword search. + * + * @return Whether or not OCR is enabled for keyword search. + */ + public boolean isOCREnabled() { + return OCREnabled; + } + + /** + * Sets whether or not OCR is enabled for keyword search. + * + * @param OCREnabled Whether or not OCR is enabled for keyword search. + */ + public void setOCREnabled(boolean OCREnabled) { + this.OCREnabled = OCREnabled; + } + + /** + * Returns true if OCR is to be perform only on images larger than 100KB. + * + * @return If true, OCR is to be performed only on images larger than 100KB. + */ + public boolean isLimitedOCREnabled() { + return limitedOCREnabled; + } + + /** + * Sets whether or not OCR should be performed only on images larger than + * 100KB. + * + * @param limitedOCREnabled Whether or not OCR should be performed only on + * images larger than 100KB. + */ + public void setLimitedOCREnabled(boolean limitedOCREnabled) { + this.limitedOCREnabled = limitedOCREnabled; + } + + /** + * Returns true if keyword search ingest should be solely limited to OCR. + * + * @return True if keyword search ingest should be solely limited to OCR. + */ + public boolean isOCROnly() { + return OCROnly; + } + + /** + * Sets whether or not keyword search ingest should be solely limited to + * OCR. + * + * @param OCROnly Whether or not keyword search ingest should be solely + * limited to OCR. + */ + public void setOCROnly(boolean OCROnly) { + this.OCROnly = OCROnly; + } + /** * @inheritDoc */ diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index ac3cdd5782..2e9138bd5c 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -20,30 +20,44 @@ - - + + - - - - - - - - - - - - - - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + @@ -55,7 +69,7 @@ - + @@ -65,7 +79,13 @@ + + + + + + @@ -96,8 +116,6 @@ - - @@ -150,5 +168,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index a71485cbb1..9be56cedbf 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -18,18 +18,15 @@ */ package org.sleuthkit.autopsy.keywordsearch; -import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; -import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT; import org.sleuthkit.autopsy.guiutils.SimpleTableCellRenderer; @@ -53,6 +50,32 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe initComponents(); customizeComponents(); } + + /* + + + TODO load: + ocrCheckBox.setSelected(KeywordSearchSettings.getOcrOption()); + limitedOcrCheckbox.setSelected(KeywordSearchSettings.getLimitedOcrOption()); + ocrCheckBox.setEnabled(!ingestRunning); + limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected() && !ingestRunning); + + TODO store: + KeywordSearchSettings.setOcrOption(ocrCheckBox.isSelected()); + KeywordSearchSettings.setLimitedOcrOption(limitedOcrCheckbox.isSelected()); + + + TODO other enable: + + if (!PlatformUtil.isWindowsOS() || !PlatformUtil.is64BitOS()) { + ocrCheckBox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsOCR()); + ocrCheckBox.setSelected(false); + ocrCheckBox.setEnabled(false); + limitedOcrCheckbox.setSelected(false); + limitedOcrCheckbox.setEnabled(false); + limitedOcrCheckbox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsLimitedOCR()); + } + */ private void initializeKeywordListSettings(KeywordSearchJobSettings settings) { keywordListNames.clear(); @@ -241,6 +264,9 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe languagesValLabel = new javax.swing.JLabel(); encodingsLabel = new javax.swing.JLabel(); keywordSearchEncodings = new javax.swing.JLabel(); + ocrCheckBox = new javax.swing.JCheckBox(); + limitedOcrCheckbox = new javax.swing.JCheckBox(); + ocrOnly = new javax.swing.JCheckBox(); setPreferredSize(new java.awt.Dimension(300, 170)); @@ -256,8 +282,6 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe } )); - listsTable.setShowHorizontalLines(false); - listsTable.setShowVerticalLines(false); listsScrollPane.setViewportView(listsTable); listsTable.setDefaultRenderer(String.class, new SimpleTableCellRenderer()); @@ -275,29 +299,59 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe keywordSearchEncodings.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.keywordSearchEncodings.text")); // NOI18N + ocrCheckBox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.ocrCheckBox.text")); // NOI18N + ocrCheckBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ocrCheckBoxActionPerformed(evt); + } + }); + + limitedOcrCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text")); // NOI18N + limitedOcrCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + limitedOcrCheckboxActionPerformed(evt); + } + }); + + ocrOnly.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.ocrOnly.text")); // NOI18N + ocrOnly.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ocrOnlyActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(listsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addContainerGap()) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(languagesLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(titleLabel) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addComponent(encodingsLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(keywordSearchEncodings))) - .addGap(0, 0, Short.MAX_VALUE)))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(titleLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(encodingsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(keywordSearchEncodings))) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(ocrCheckBox) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(limitedOcrCheckbox) + .addComponent(ocrOnly)))) + .addContainerGap()))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -305,7 +359,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(7, 7, 7) .addComponent(titleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 41, Short.MAX_VALUE) + .addComponent(listsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 22, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -314,16 +368,39 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(encodingsLabel) .addComponent(keywordSearchEncodings)) + .addGap(18, 18, 18) + .addComponent(ocrCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ocrOnly) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(limitedOcrCheckbox) .addContainerGap()) ); }// //GEN-END:initComponents + + private void ocrCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrCheckBoxActionPerformed + limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected()); + firePropertyChange(KeywordSearchOptionsPanelController.PROP_CHANGED, null, null); + }//GEN-LAST:event_ocrCheckBoxActionPerformed + + private void limitedOcrCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_limitedOcrCheckboxActionPerformed + firePropertyChange(KeywordSearchOptionsPanelController.PROP_CHANGED, null, null); + }//GEN-LAST:event_limitedOcrCheckboxActionPerformed + + private void ocrOnlyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrOnlyActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_ocrOnlyActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel encodingsLabel; private javax.swing.JLabel keywordSearchEncodings; private javax.swing.JLabel languagesLabel; private javax.swing.JLabel languagesValLabel; + private javax.swing.JCheckBox limitedOcrCheckbox; private javax.swing.JScrollPane listsScrollPane; private javax.swing.JTable listsTable; + private javax.swing.JCheckBox ocrCheckBox; + private javax.swing.JCheckBox ocrOnly; private javax.swing.JLabel titleLabel; // End of variables declaration//GEN-END:variables } From 2051d68751b9b5dd00d299a0ed00b55fd993d580 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 10 Jun 2021 13:07:10 -0400 Subject: [PATCH 02/33] ocr only flag --- .../autopsy/textextractors/TextExtractor.java | 18 ++- .../textextractors/TikaTextExtractor.java | 47 +++--- .../textextractors/configs/ImageConfig.java | 48 ++++-- .../autopsy/keywordsearch/Bundle.properties | 2 +- .../KeywordSearchIngestModule.java | 141 ++++++++++-------- .../KeywordSearchJobSettings.java | 68 ++++++--- .../KeywordSearchJobSettingsPanel.form | 15 +- .../KeywordSearchJobSettingsPanel.java | 76 ++++------ .../keywordsearch/KeywordSearchSettings.java | 65 +++----- 9 files changed, 267 insertions(+), 213 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractor.java index 69b98cdd12..e6c0ddcaba 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractor.java @@ -22,6 +22,8 @@ import java.io.Reader; import java.util.Collections; import java.util.Map; import org.openide.util.Lookup; +import org.sleuthkit.autopsy.textextractors.configs.ImageConfig; +import org.sleuthkit.datamodel.AbstractFile; /** * Extracts the text out of Content instances and exposes them as a Reader. @@ -63,10 +65,10 @@ public interface TextExtractor { default void setExtractionSettings(Lookup context) { //no-op by default } - + /** * Retrieves content metadata, if any. - * + * * @return Metadata as key -> value map */ default Map getMetadata() { @@ -74,7 +76,17 @@ public interface TextExtractor { } /** - * System level exception for reader initialization. + * Returns true if this text extractor, based on the provided settings, will + * perform ocr. + * + * @return True if will perform OCR. + */ + default boolean willUseOCR() { + return false; + } + + /** + * System level exception for reader initialization. */ public class InitReaderException extends Exception { diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 9540f72271..a03dccd706 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -171,9 +171,30 @@ final class TikaTextExtractor implements TextExtractor { * * @return Flag indicating if OCR is set to be used. */ - private boolean ocrEnabled() { - return TESSERACT_PATH != null && tesseractOCREnabled - && PlatformUtil.isWindowsOS() == true && PlatformUtil.is64BitOS(); + /** + * Method to indicate if OCR should be performed on this image file. Checks + * to see if the limited OCR setting is enabled. If it is it will also check + * that one of the limiting factors is true. + * + * @param file The AbstractFile which OCR might be performed on. + * @param boolean The configuration setting which indicates if limited OCR + * is enabled in Keyword Search. + * + * @return True if limited OCR is not enabled or the image is greater than + * 100KB in size or the image is a derived file. + */ + @Override + public boolean willUseOCR() { + // If Tesseract has been installed and is set to be used through + // configuration, then ocr is enabled. OCR can only currently be run on 64 + // bit Windows OS. + return TESSERACT_PATH != null + && tesseractOCREnabled + && PlatformUtil.isWindowsOS() == true + && PlatformUtil.is64BitOS() + // if limited OCR is not enabled or the image is greater than 100KB in size or the image is a derived file. + && content instanceof AbstractFile + && (!limitedOCREnabled || content.getSize() > LIMITED_OCR_SIZE_MIN || ((AbstractFile) content).getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED); } /** @@ -200,7 +221,7 @@ final class TikaTextExtractor implements TextExtractor { // Handle images seperately so the OCR task can be cancelled. // See JIRA-4519 for the need to have cancellation in the UI and ingest. - if (ocrEnabled() && mimeType.toLowerCase().startsWith("image/") && useOcrOnFile(file)) { + if (willUseOCR() && mimeType.toLowerCase().startsWith("image/")) { InputStream imageOcrStream = performOCR(file); return new InputStreamReader(imageOcrStream, Charset.forName("UTF-8")); } @@ -221,7 +242,7 @@ final class TikaTextExtractor implements TextExtractor { officeParserConfig.setUseSAXDocxExtractor(true); parseContext.set(OfficeParserConfig.class, officeParserConfig); - if (ocrEnabled() && useOcrOnFile(file)) { + if (willUseOCR()) { // Configure OCR for Tika if it chooses to run OCR // during extraction TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); @@ -347,22 +368,6 @@ final class TikaTextExtractor implements TextExtractor { } } - /** - * Method to indicate if OCR should be performed on this image file. Checks - * to see if the limited OCR setting is enabled. If it is it will also check - * that one of the limiting factors is true. - * - * @param file The AbstractFile which OCR might be performed on. - * @param boolean The configuration setting which indicates if limited OCR - * is enabled in Keyword Search. - * - * @return True if limited OCR is not enabled or the image is greater than - * 100KB in size or the image is a derived file. - */ - private boolean useOcrOnFile(AbstractFile file) { - return !limitedOCREnabled || file.getSize() > LIMITED_OCR_SIZE_MIN || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED; - } - /** * Wraps the creation of a TikaReader into a Future so that it can be * cancelled. diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java index fc4f27add1..d73b0c9f2a 100755 --- a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java @@ -36,6 +36,7 @@ public class ImageConfig { private boolean OCREnabled = false; private boolean limitedOCREnabled = false; + private boolean OCROnly = false; private List ocrLanguages = null; private final TimedProcessTerminator ocrTimedTerminator = new TimedProcessTerminator(OCR_TIMEOUT_SECONDS); @@ -49,6 +50,26 @@ public class ImageConfig { this.OCREnabled = enabled; } + /** + * Gets the OCR flag that has been set. By default this flag is turned off. + * + * @return Flag indicating if OCR is enabled. + */ + public boolean getOCREnabled() { + return this.OCREnabled; + } + + /** + * Gets the limited OCR flag to indicate if OCR should be limited to larger + * images and images which were extracted from documents. + * + * @return Flag indicating if limited OCR is enabled. True if OCR should be + * limited, false otherwise.. + */ + public boolean getLimitedOCREnabled() { + return limitedOCREnabled; + } + /** * Enables the limiting OCR to be run on larger images and images which were * extracted from documents. @@ -58,16 +79,26 @@ public class ImageConfig { public void setLimitedOCREnabled(boolean enabled) { this.limitedOCREnabled = enabled; } + + /** + * Sets whether to only performs keyword search with OCR. + * + * @param enabled Only performs keyword search with OCR if true. + */ + public void setOCROnly(boolean enabled) { + this.OCREnabled = enabled; + } /** - * Gets the OCR flag that has been set. By default this flag is turned off. + * Returns whether to only performs keyword search with OCR. * - * @return Flag indicating if OCR is enabled. + * @return Whether to only performs keyword search with OCR. */ - public boolean getOCREnabled() { + public boolean getOCROnly() { return this.OCREnabled; } + /** * Sets languages for OCR. Can be null. * @@ -98,15 +129,4 @@ public class ImageConfig { public ProcessTerminator getOCRTimeoutTerminator() { return ocrTimedTerminator; } - - /** - * Gets the limited OCR flag to indicate if OCR should be limited to larger - * images and images which were extracted from documents. - * - * @return Flag indicating if limited OCR is enabled. True if OCR should be - * limited, false otherwise.. - */ - public boolean getLimitedOCREnabled() { - return limitedOCREnabled; - } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index f7464526cb..c53aaf25d6 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -321,4 +321,4 @@ ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) -KeywordSearchJobSettingsPanel.ocrOnly.text=Do OCR only +KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Do OCR only diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 034f53af74..bd9bfd4b77 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2019 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.List; import static java.util.Locale.US; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.stream.Collectors; @@ -43,7 +44,6 @@ import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.ExecUtil.ProcessTerminator; -import org.sleuthkit.autopsy.coreutils.ExecUtil.TimedProcessTerminator; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.ingest.FileIngestModule; @@ -132,20 +132,19 @@ public final class KeywordSearchIngestModule implements FileIngestModule { "Last-Printed", //NON-NLS "Creation-Date"); //NON-NLS - private static final Map METADATA_TYPES_MAP = ImmutableMap.builder() - .put("Last-Save-Date", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_MODIFIED) - .put("Last-Author", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID) - .put("Creation-Date", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED) - .put("Company", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ORGANIZATION) - .put("Author", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_OWNER) - .put("Application-Name", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME) - .put("Last-Printed", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LAST_PRINTED_DATETIME) - .put("Producer", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME) - .put("Title", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION) - .put("pdf:PDFVersion", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VERSION) - .build(); + private static final Map METADATA_TYPES_MAP = ImmutableMap.builder() + .put("Last-Save-Date", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_MODIFIED) + .put("Last-Author", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID) + .put("Creation-Date", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED) + .put("Company", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ORGANIZATION) + .put("Author", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_OWNER) + .put("Application-Name", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME) + .put("Last-Printed", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LAST_PRINTED_DATETIME) + .put("Producer", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME) + .put("Title", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION) + .put("pdf:PDFVersion", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VERSION) + .build(); - /** * Options for this extractor */ @@ -206,8 +205,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * for final statistics at the end of the job. * * @param ingestJobId id of ingest job - * @param fileId id of file - * @param status ingest status of the file + * @param fileId id of file + * @param status ingest status of the file */ private static void putIngestStatus(long ingestJobId, long fileId, IngestStatus status) { synchronized (ingestStatus) { @@ -350,12 +349,21 @@ public final class KeywordSearchIngestModule implements FileIngestModule { return ProcessResult.OK; } + // if ocr only is enabled and not an ocr file, return + Optional extractorOpt = getExtractor(abstractFile); + + // if ocr only and the extractor is not present or will not perform ocr on this file, continue + if (settings.isOCREnabled() && settings.isOCROnly() && + (!extractorOpt.isPresent() || !extractorOpt.get().willUseOCR())) { + return ProcessResult.OK; + } + if (KeywordSearchSettings.getSkipKnown() && abstractFile.getKnown().equals(FileKnown.KNOWN)) { //index meta-data only if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - indexer.indexFile(abstractFile, false); + indexer.indexFile(extractorOpt, abstractFile, false); return ProcessResult.OK; } @@ -363,7 +371,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - indexer.indexFile(abstractFile, true); + indexer.indexFile(extractorOpt, abstractFile, true); // Start searching if it hasn't started already if (!startedSearching) { @@ -489,6 +497,20 @@ public final class KeywordSearchIngestModule implements FileIngestModule { } } + private Optional getExtractor(AbstractFile abstractFile) { + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setOCREnabled(settings.isOCREnabled()); + imageConfig.setLimitedOCREnabled(settings.isLimitedOCREnabled()); + imageConfig.setOCROnly(settings.isOCROnly()); + ProcessTerminator terminator = () -> context.fileIngestIsCancelled(); + Lookup extractionContext = Lookups.fixed(imageConfig, terminator); + try { + return Optional.ofNullable(TextExtractorFactory.getExtractor(abstractFile, extractionContext)); + } catch (TextExtractorFactory.NoTextExtractorFound ex) { + return Optional.empty(); + } + } + /** * File indexer, processes and indexes known/allocated files, * unknown/unallocated files and directories accordingly @@ -502,25 +524,26 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * streaming) from the file Divide the file into chunks and index the * chunks * - * @param aFile file to extract strings from, divide into chunks and - * index - * @param extractedMetadata Map that will be populated with the file's metadata. + * @param extractorOptional The textExtractor to use with this file or + * empty. + * @param aFile file to extract strings from, divide into + * chunks and index + * @param extractedMetadata Map that will be populated with the file's + * metadata. * * @return true if the file was text_ingested, false otherwise * * @throws IngesterException exception thrown if indexing failed */ - private boolean extractTextAndIndex(AbstractFile aFile, Map extractedMetadata) throws IngesterException { - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setOCREnabled(KeywordSearchSettings.getOcrOption()); - imageConfig.setLimitedOCREnabled(KeywordSearchSettings.getLimitedOcrOption()); - ProcessTerminator terminator = () -> context.fileIngestIsCancelled(); - Lookup extractionContext = Lookups.fixed(imageConfig, terminator); + private boolean extractTextAndIndex(Optional extractorOptional, AbstractFile aFile, + Map extractedMetadata) throws IngesterException { try { - TextExtractor extractor = TextExtractorFactory.getExtractor(aFile, extractionContext); + if (!extractorOptional.isPresent()) { + return false; + } + TextExtractor extractor = extractorOptional.get(); Reader fileText = extractor.getReader(); - Reader finalReader; try { Map metadata = extractor.getMetadata(); @@ -547,17 +570,17 @@ public final class KeywordSearchIngestModule implements FileIngestModule { } //divide into chunks and index return Ingester.getDefault().indexText(finalReader, aFile.getId(), aFile.getName(), aFile, context); - } catch (TextExtractorFactory.NoTextExtractorFound | TextExtractor.InitReaderException ex) { + } catch (TextExtractor.InitReaderException ex) { //No text extractor found... run the default instead return false; } } - + private void createMetadataArtifact(AbstractFile aFile, Map metadata) { - + String moduleName = KeywordSearchIngestModule.class.getName(); - - Collection attributes = new ArrayList<>(); + + Collection attributes = new ArrayList<>(); Collection bbartifacts = new ArrayList<>(); for (Map.Entry entry : metadata.entrySet()) { if (METADATA_TYPES_MAP.containsKey(entry.getKey())) { @@ -573,32 +596,31 @@ public final class KeywordSearchIngestModule implements FileIngestModule { bbartifacts.add(bbart); } catch (TskCoreException ex) { // Log error and return to continue processing - logger.log(Level.WARNING, String.format("Error creating or adding metadata artifact for file %s.", aFile.getParentPath() + aFile.getName()), ex); //NON-NLS - return; + logger.log(Level.WARNING, String.format("Error creating or adding metadata artifact for file %s.", aFile.getParentPath() + aFile.getName()), ex); //NON-NLS + return; } if (!bbartifacts.isEmpty()) { - try{ + try { Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard().postArtifacts(bbartifacts, moduleName); } catch (NoCurrentCaseException | Blackboard.BlackboardException ex) { // Log error and return to continue processing - logger.log(Level.WARNING, String.format("Unable to post blackboard artifacts for file $s.", aFile.getParentPath() + aFile.getName()) , ex); //NON-NLS + logger.log(Level.WARNING, String.format("Unable to post blackboard artifacts for file $s.", aFile.getParentPath() + aFile.getName()), ex); //NON-NLS return; } } } } - private BlackboardAttribute checkAttribute(String key, String value) { String moduleName = KeywordSearchIngestModule.class.getName(); - if (!value.isEmpty() && value.charAt(0) != ' ') { + if (!value.isEmpty() && value.charAt(0) != ' ') { if (METADATA_DATE_TYPES.contains(key)) { - SimpleDateFormat metadataDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", US); + SimpleDateFormat metadataDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", US); Long metadataDateTime = Long.valueOf(0); try { - String metadataDate = value.replaceAll("T"," ").replaceAll("Z", ""); + String metadataDate = value.replaceAll("T", " ").replaceAll("Z", ""); Date usedDate = metadataDateFormat.parse(metadataDate); - metadataDateTime = usedDate.getTime()/1000; + metadataDateTime = usedDate.getTime() / 1000; return new BlackboardAttribute(METADATA_TYPES_MAP.get(key), moduleName, metadataDateTime); } catch (ParseException ex) { // catching error and displaying date that could not be parsed then will continue on. @@ -609,12 +631,11 @@ public final class KeywordSearchIngestModule implements FileIngestModule { return new BlackboardAttribute(METADATA_TYPES_MAP.get(key), moduleName, value); } } - + return null; } - - + /** * Pretty print the text extractor metadata. * @@ -639,7 +660,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * Extract strings using heuristics from the file and add to index. * * @param aFile file to extract strings from, divide into chunks and - * index + * index * * @return true if the file was text_ingested, false otherwise */ @@ -668,21 +689,23 @@ public final class KeywordSearchIngestModule implements FileIngestModule { /** * Adds the file to the index. Detects file type, calls extractors, etc. * - * @param aFile File to analyze + * @param extractor The textExtractor to use with this file or empty + * if no extractor found. + * @param aFile File to analyze * @param indexContent False if only metadata should be text_ingested. - * True if content and metadata should be index. + * True if content and metadata should be index. */ - private void indexFile(AbstractFile aFile, boolean indexContent) { + private void indexFile(Optional extractor, AbstractFile aFile, boolean indexContent) { //logger.log(Level.INFO, "Processing AbstractFile: " + abstractFile.getName()); TskData.TSK_DB_FILES_TYPE_ENUM aType = aFile.getType(); /** * Extract unicode strings from unallocated and unused blocks and - * carved text files. The reason for performing string extraction - * on these is because they all may contain multiple encodings which - * can cause text to be missed by the more specialized text extractors - * used below. + * carved text files. The reason for performing string extraction on + * these is because they all may contain multiple encodings which + * can cause text to be missed by the more specialized text + * extractors used below. */ if ((aType.equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) || aType.equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS)) @@ -745,7 +768,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { extractStringsAndIndex(aFile); return; } - if (!extractTextAndIndex(aFile, extractedMetadata)) { + if (!extractTextAndIndex(extractor, aFile, extractedMetadata)) { // Text extractor not found for file. Extract string only. putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT); } else { @@ -773,7 +796,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (wasTextAdded == false) { extractStringsAndIndex(aFile); } - + // Now that the indexing is complete, create the metadata artifact (if applicable). // It is unclear why calling this from extractTextAndIndex() generates // errors. @@ -783,8 +806,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { } /** - * Adds the text file to the index given an encoding. - * Returns true if indexing was successful and false otherwise. + * Adds the text file to the index given an encoding. Returns true if + * indexing was successful and false otherwise. * * @param aFile Text file to analyze */ diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index 7b81298c9c..f6e8a52d73 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -29,12 +29,18 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { private static final long serialVersionUID = 1L; + private HashSet namesOfEnabledKeywordLists; private HashSet namesOfDisabledKeywordLists; // Added in version 1.1 - private boolean OCREnabled; - private boolean limitedOCREnabled; - private boolean OCROnly; + /** + * These are nullable so that if no serialized setting, the setting can + * defer to legacy KeywordSearchSettings. + */ + private Boolean ocrEnabled; + private Boolean limitedOCREnabled; + + private boolean ocrOnly; /** * Constructs ingest job settings for the keywords search module. @@ -42,7 +48,13 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * @param namesOfEnabledKeywordLists A list of enabled keywords lists. */ KeywordSearchJobSettings(List namesOfEnabledKeywordLists) { - this(namesOfEnabledKeywordLists, new ArrayList()); + this.namesOfEnabledKeywordLists = new HashSet<>(namesOfEnabledKeywordLists); + this.namesOfDisabledKeywordLists = new HashSet<>(); + + // explicitly set to default value + this.ocrEnabled = null; + this.limitedOCREnabled = null; + this.ocrOnly = false; } /** @@ -50,10 +62,19 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * * @param namesOfEnabledKeywordLists A list of enabled keywords lists. * @param namesOfDisabledKeywordLists A list of disabled keywords lists. + * @param ocrEnabled Whether or not OCR is enabled for + * keyword search. + * @param limitedOCREnabled If true, OCR is to be performed only + * on images larger than 100KB. + * @param ocrOnly True if keyword search ingest should + * be solely limited to OCR. */ - KeywordSearchJobSettings(List namesOfEnabledKeywordLists, List namesOfDisabledKeywordLists) { + KeywordSearchJobSettings(List namesOfEnabledKeywordLists, List namesOfDisabledKeywordLists, boolean ocrEnabled, boolean limitedOCREnabled, boolean ocrOnly) { this.namesOfEnabledKeywordLists = new HashSet<>(namesOfEnabledKeywordLists); this.namesOfDisabledKeywordLists = new HashSet<>(namesOfDisabledKeywordLists); + this.ocrEnabled = ocrEnabled; + this.limitedOCREnabled = limitedOCREnabled; + this.ocrOnly = ocrOnly; } /** @@ -61,26 +82,37 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * * @return Whether or not OCR is enabled for keyword search. */ - public boolean isOCREnabled() { - return OCREnabled; + @SuppressWarnings("Deprecation") + boolean isOCREnabled() { + if (ocrEnabled == null) { + ocrEnabled = KeywordSearchSettings.getOcrOption(); + } + + return ocrEnabled; } /** * Sets whether or not OCR is enabled for keyword search. * - * @param OCREnabled Whether or not OCR is enabled for keyword search. + * @param ocrEnabled Whether or not OCR is enabled for keyword search. */ - public void setOCREnabled(boolean OCREnabled) { - this.OCREnabled = OCREnabled; + void setOCREnabled(boolean ocrEnabled) { + this.ocrEnabled = ocrEnabled; } /** * Returns true if OCR is to be perform only on images larger than 100KB. + * May defer to KeywordSearchSettings if no setting serialized. * * @return If true, OCR is to be performed only on images larger than 100KB. */ - public boolean isLimitedOCREnabled() { - return limitedOCREnabled; + @SuppressWarnings("Deprecation") + boolean isLimitedOCREnabled() { + if (limitedOCREnabled == null) { + limitedOCREnabled = KeywordSearchSettings.getLimitedOcrOption(); + } + + return ocrEnabled; } /** @@ -90,7 +122,7 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * @param limitedOCREnabled Whether or not OCR should be performed only on * images larger than 100KB. */ - public void setLimitedOCREnabled(boolean limitedOCREnabled) { + void setLimitedOCREnabled(boolean limitedOCREnabled) { this.limitedOCREnabled = limitedOCREnabled; } @@ -99,19 +131,19 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * * @return True if keyword search ingest should be solely limited to OCR. */ - public boolean isOCROnly() { - return OCROnly; + boolean isOCROnly() { + return ocrOnly; } /** * Sets whether or not keyword search ingest should be solely limited to * OCR. * - * @param OCROnly Whether or not keyword search ingest should be solely + * @param ocrOnly Whether or not keyword search ingest should be solely * limited to OCR. */ - public void setOCROnly(boolean OCROnly) { - this.OCROnly = OCROnly; + void setOCROnly(boolean ocrOnly) { + this.ocrOnly = ocrOnly; } /** diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index 2e9138bd5c..de1d92d5af 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -39,11 +39,6 @@ - - - - - @@ -53,7 +48,7 @@ - + @@ -82,7 +77,7 @@ - + @@ -188,14 +183,14 @@ - + - + - + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index 9be56cedbf..92806a70d8 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -28,6 +28,7 @@ import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT; import org.sleuthkit.autopsy.guiutils.SimpleTableCellRenderer; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; @@ -39,43 +40,17 @@ import org.sleuthkit.autopsy.keywordsearch.KeywordSearchIngestModule.StringsExtr */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSettingsPanel implements PropertyChangeListener { - private final KeywordListsTableModel tableModel = new KeywordListsTableModel(); private final List keywordListNames = new ArrayList<>(); private final Map keywordListStates = new HashMap<>(); private final XmlKeywordSearchList keywordListsManager = XmlKeywordSearchList.getCurrent(); + KeywordSearchJobSettingsPanel(KeywordSearchJobSettings initialSettings) { initializeKeywordListSettings(initialSettings); initComponents(); customizeComponents(); } - - /* - - - TODO load: - ocrCheckBox.setSelected(KeywordSearchSettings.getOcrOption()); - limitedOcrCheckbox.setSelected(KeywordSearchSettings.getLimitedOcrOption()); - ocrCheckBox.setEnabled(!ingestRunning); - limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected() && !ingestRunning); - - TODO store: - KeywordSearchSettings.setOcrOption(ocrCheckBox.isSelected()); - KeywordSearchSettings.setLimitedOcrOption(limitedOcrCheckbox.isSelected()); - - - TODO other enable: - - if (!PlatformUtil.isWindowsOS() || !PlatformUtil.is64BitOS()) { - ocrCheckBox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsOCR()); - ocrCheckBox.setSelected(false); - ocrCheckBox.setEnabled(false); - limitedOcrCheckbox.setSelected(false); - limitedOcrCheckbox.setEnabled(false); - limitedOcrCheckbox.setText(Bundle.KeywordSearchGlobalSearchSettingsPanel_customizeComponents_windowsLimitedOCR()); - } - */ private void initializeKeywordListSettings(KeywordSearchJobSettings settings) { keywordListNames.clear(); @@ -86,6 +61,23 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe keywordListNames.add(listName); keywordListStates.put(listName, settings.keywordListIsEnabled(listName)); } + + ocrCheckBox.setSelected(settings.isOCREnabled()); + limitedOcrCheckbox.setSelected(settings.isLimitedOCREnabled()); + ocrOnlyCheckbox.setSelected(settings.isOCROnly()); + + handleOcrEnabled(settings.isOCREnabled()); + } + + /** + * Handles setting enabled state of checkbox. + * @param ocrEnabled Whether or not the ocr setting is enabled. + */ + private void handleOcrEnabled(boolean ocrEnabled) { + boolean platformSupported = PlatformUtil.isWindowsOS() && PlatformUtil.is64BitOS(); + ocrCheckBox.setEnabled(platformSupported); + limitedOcrCheckbox.setEnabled(platformSupported && ocrEnabled); + ocrOnlyCheckbox.setEnabled(platformSupported && ocrEnabled); } private void customizeComponents() { @@ -197,7 +189,8 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe disabledListNames.add(listName); } } - return new KeywordSearchJobSettings(enabledListNames, disabledListNames); + return new KeywordSearchJobSettings(enabledListNames, disabledListNames, + this.ocrCheckBox.isSelected(), this.limitedOcrCheckbox.isSelected(), this.ocrOnlyCheckbox.isSelected()); } void reset(KeywordSearchJobSettings newSettings) { @@ -266,7 +259,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe keywordSearchEncodings = new javax.swing.JLabel(); ocrCheckBox = new javax.swing.JCheckBox(); limitedOcrCheckbox = new javax.swing.JCheckBox(); - ocrOnly = new javax.swing.JCheckBox(); + ocrOnlyCheckbox = new javax.swing.JCheckBox(); setPreferredSize(new java.awt.Dimension(300, 170)); @@ -313,10 +306,10 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe } }); - ocrOnly.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.ocrOnly.text")); // NOI18N - ocrOnly.addActionListener(new java.awt.event.ActionListener() { + ocrOnlyCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text")); // NOI18N + ocrOnlyCheckbox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - ocrOnlyActionPerformed(evt); + ocrOnlyCheckboxActionPerformed(evt); } }); @@ -338,10 +331,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addComponent(encodingsLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(keywordSearchEncodings))) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -350,7 +340,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(21, 21, 21) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(limitedOcrCheckbox) - .addComponent(ocrOnly)))) + .addComponent(ocrOnlyCheckbox)))) .addContainerGap()))) ); layout.setVerticalGroup( @@ -359,7 +349,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(7, 7, 7) .addComponent(titleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(listsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 22, Short.MAX_VALUE) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 22, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -371,7 +361,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(18, 18, 18) .addComponent(ocrCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ocrOnly) + .addComponent(ocrOnlyCheckbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(limitedOcrCheckbox) .addContainerGap()) @@ -379,7 +369,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe }// //GEN-END:initComponents private void ocrCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrCheckBoxActionPerformed - limitedOcrCheckbox.setEnabled(ocrCheckBox.isSelected()); + handleOcrEnabled(ocrCheckBox.isSelected()); firePropertyChange(KeywordSearchOptionsPanelController.PROP_CHANGED, null, null); }//GEN-LAST:event_ocrCheckBoxActionPerformed @@ -387,9 +377,9 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe firePropertyChange(KeywordSearchOptionsPanelController.PROP_CHANGED, null, null); }//GEN-LAST:event_limitedOcrCheckboxActionPerformed - private void ocrOnlyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrOnlyActionPerformed + private void ocrOnlyCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ocrOnlyCheckboxActionPerformed // TODO add your handling code here: - }//GEN-LAST:event_ocrOnlyActionPerformed + }//GEN-LAST:event_ocrOnlyCheckboxActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel encodingsLabel; @@ -400,7 +390,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe private javax.swing.JScrollPane listsScrollPane; private javax.swing.JTable listsTable; private javax.swing.JCheckBox ocrCheckBox; - private javax.swing.JCheckBox ocrOnly; + private javax.swing.JCheckBox ocrOnlyCheckbox; private javax.swing.JLabel titleLabel; // End of variables declaration//GEN-END:variables } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java index 0db0b30684..b7057a2c89 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSettings.java @@ -133,20 +133,14 @@ class KeywordSearchSettings { ModuleSettings.setConfigSetting(PROPERTIES_OPTIONS, key, val); } - /** - * Save OCR setting to permanent storage - * - * @param enabled Is OCR enabled? - */ - static void setOcrOption(boolean enabled) { - ModuleSettings.setConfigSetting(PROPERTIES_OPTIONS, OCR_ENABLED, (enabled ? "true" : "false")); //NON-NLS - } - /** * Get OCR setting from permanent storage * * @return Is OCR enabled? + * + * @deprecated Please use KeywordSearchJobSettings instead. */ + @Deprecated static boolean getOcrOption() { if (ModuleSettings.settingExists(PROPERTIES_OPTIONS, OCR_ENABLED)) { return ModuleSettings.getConfigSetting(PROPERTIES_OPTIONS, OCR_ENABLED).equals("true"); //NON-NLS @@ -155,6 +149,24 @@ class KeywordSearchSettings { } } + /** + * Gets the limited OCR flag to indicate if OCR should be limited to larger + * images and images which were extracted from documents. + * + * @return Flag indicating if limited OCR is enabled. True if OCR should be + * limited, false otherwise. + * + * @deprecated Please use KeywordSearchJobSettings instead. + */ + @Deprecated + static boolean getLimitedOcrOption() { + if (ModuleSettings.settingExists(PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED)) { + return ModuleSettings.getConfigSetting(PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED).equals("true"); //NON-NLS + } else { + return LIMITED_OCR_ENABLED_DEFAULT; + } + } + static void setShowSnippets(boolean showSnippets) { ModuleSettings.setConfigSetting(PROPERTIES_OPTIONS, SHOW_SNIPPETS, (showSnippets ? "true" : "false")); //NON-NLS } @@ -246,45 +258,10 @@ class KeywordSearchSettings { logger.log(Level.INFO, "No configuration for UTF16 found, generating defaults..."); //NON-NLS KeywordSearchSettings.setStringExtractOption(StringsExtractOptions.EXTRACT_UTF16.toString(), Boolean.TRUE.toString()); } - //setting OCR default (disabled by default) - if (!ModuleSettings.settingExists(KeywordSearchSettings.PROPERTIES_OPTIONS, OCR_ENABLED)) { - logger.log(Level.INFO, "No configuration for OCR found, generating defaults..."); //NON-NLS - KeywordSearchSettings.setOcrOption(OCR_ENABLED_DEFAULT); - } - //setting OCR default (disabled by default) - if (!ModuleSettings.settingExists(KeywordSearchSettings.PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED)) { - logger.log(Level.INFO, "No configuration for OCR found, generating defaults..."); //NON-NLS - KeywordSearchSettings.setLimitedOcrOption(LIMITED_OCR_ENABLED_DEFAULT); - } //setting default Latin-1 Script if (!ModuleSettings.settingExists(KeywordSearchSettings.PROPERTIES_SCRIPTS, SCRIPT.LATIN_1.name())) { logger.log(Level.INFO, "No configuration for Scripts found, generating defaults..."); //NON-NLS ModuleSettings.setConfigSetting(KeywordSearchSettings.PROPERTIES_SCRIPTS, SCRIPT.LATIN_1.name(), Boolean.toString(true)); } } - - /** - * Enables the limiting OCR to be run on larger images and images which were - * extracted from documents. - * - * @param enabled Flag indicating if OCR is enabled. - */ - static void setLimitedOcrOption(boolean enabled) { - ModuleSettings.setConfigSetting(PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED, (enabled ? "true" : "false")); //NON-NLS - } - - /** - * Gets the limited OCR flag to indicate if OCR should be limited to larger - * images and images which were extracted from documents. - * - * @return Flag indicating if limited OCR is enabled. True if OCR should be - * limited, false otherwise.. - */ - static boolean getLimitedOcrOption() { - if (ModuleSettings.settingExists(PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED)) { - return ModuleSettings.getConfigSetting(PROPERTIES_OPTIONS, LIMITED_OCR_ENABLED).equals("true"); //NON-NLS - } else { - return LIMITED_OCR_ENABLED_DEFAULT; - } - } } From 497c8ba2e39fa00c42251c22410e0fc601b0ed7f Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 10 Jun 2021 13:44:06 -0400 Subject: [PATCH 03/33] fix --- .../autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index 92806a70d8..253e0624de 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -47,9 +47,9 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe KeywordSearchJobSettingsPanel(KeywordSearchJobSettings initialSettings) { - initializeKeywordListSettings(initialSettings); initComponents(); customizeComponents(); + initializeKeywordListSettings(initialSettings); } private void initializeKeywordListSettings(KeywordSearchJobSettings settings) { From b17917977e33cade91a213ad29b58dc53104b398 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 14 Jun 2021 09:39:36 -0400 Subject: [PATCH 04/33] remove ocr only flag from ImageConfig --- .../textextractors/configs/ImageConfig.java | 20 ------------------- .../KeywordSearchIngestModule.java | 1 - 2 files changed, 21 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java index d73b0c9f2a..4989c5d42f 100755 --- a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java @@ -36,7 +36,6 @@ public class ImageConfig { private boolean OCREnabled = false; private boolean limitedOCREnabled = false; - private boolean OCROnly = false; private List ocrLanguages = null; private final TimedProcessTerminator ocrTimedTerminator = new TimedProcessTerminator(OCR_TIMEOUT_SECONDS); @@ -79,25 +78,6 @@ public class ImageConfig { public void setLimitedOCREnabled(boolean enabled) { this.limitedOCREnabled = enabled; } - - /** - * Sets whether to only performs keyword search with OCR. - * - * @param enabled Only performs keyword search with OCR if true. - */ - public void setOCROnly(boolean enabled) { - this.OCREnabled = enabled; - } - - /** - * Returns whether to only performs keyword search with OCR. - * - * @return Whether to only performs keyword search with OCR. - */ - public boolean getOCROnly() { - return this.OCREnabled; - } - /** * Sets languages for OCR. Can be null. diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index bd9bfd4b77..5497bbf67f 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -501,7 +501,6 @@ public final class KeywordSearchIngestModule implements FileIngestModule { ImageConfig imageConfig = new ImageConfig(); imageConfig.setOCREnabled(settings.isOCREnabled()); imageConfig.setLimitedOCREnabled(settings.isLimitedOCREnabled()); - imageConfig.setOCROnly(settings.isOCROnly()); ProcessTerminator terminator = () -> context.fileIngestIsCancelled(); Lookup extractionContext = Lookups.fixed(imageConfig, terminator); try { From e825f33740a3fb3ad256557f03b01dd40b1aa8cb Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 14 Jun 2021 15:23:31 -0400 Subject: [PATCH 05/33] updates for limited ocr option --- .../textextractors/TikaTextExtractor.java | 8 ++--- .../textextractors/configs/ImageConfig.java | 22 ------------- .../autopsy/keywordsearch/Bundle.properties | 2 +- .../KeywordSearchIngestModule.java | 32 ++++++++++++++++--- .../KeywordSearchJobSettingsPanel.form | 24 +++++++------- .../KeywordSearchJobSettingsPanel.java | 24 +++++++------- 6 files changed, 54 insertions(+), 58 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index a03dccd706..3333894891 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -134,7 +134,6 @@ final class TikaTextExtractor implements TextExtractor { // Used to log to the tika file that is why it uses the java.util.logging.logger class instead of the Autopsy one private static final java.util.logging.Logger TIKA_LOGGER = java.util.logging.Logger.getLogger("Tika"); //NON-NLS private static final Logger AUTOPSY_LOGGER = Logger.getLogger(TikaTextExtractor.class.getName()); - private static final int LIMITED_OCR_SIZE_MIN = 100 * 1024; private final ThreadFactory tikaThreadFactory = new ThreadFactoryBuilder().setNameFormat("tika-reader-%d").build(); private final ExecutorService executorService = Executors.newSingleThreadExecutor(tikaThreadFactory); @@ -144,7 +143,6 @@ final class TikaTextExtractor implements TextExtractor { private final Content content; private boolean tesseractOCREnabled; - private boolean limitedOCREnabled; private static final String TESSERACT_DIR_NAME = "Tesseract-OCR"; //NON-NLS private static final String TESSERACT_EXECUTABLE = "tesseract.exe"; //NON-NLS private static final File TESSERACT_PATH = locateTesseractExecutable(); @@ -190,11 +188,10 @@ final class TikaTextExtractor implements TextExtractor { // bit Windows OS. return TESSERACT_PATH != null && tesseractOCREnabled - && PlatformUtil.isWindowsOS() == true + && PlatformUtil.isWindowsOS() && PlatformUtil.is64BitOS() // if limited OCR is not enabled or the image is greater than 100KB in size or the image is a derived file. - && content instanceof AbstractFile - && (!limitedOCREnabled || content.getSize() > LIMITED_OCR_SIZE_MIN || ((AbstractFile) content).getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED); + && content instanceof AbstractFile; } /** @@ -557,7 +554,6 @@ final class TikaTextExtractor implements TextExtractor { ImageConfig configInstance = context.lookup(ImageConfig.class); if (configInstance != null) { this.tesseractOCREnabled = configInstance.getOCREnabled(); - this.limitedOCREnabled = configInstance.getLimitedOCREnabled(); if (Objects.nonNull(configInstance.getOCRLanguages())) { this.languagePacks = formatLanguagePacks(configInstance.getOCRLanguages()); diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java index 4989c5d42f..39fb7db959 100755 --- a/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/configs/ImageConfig.java @@ -35,7 +35,6 @@ public class ImageConfig { private static final int OCR_TIMEOUT_SECONDS = 30 * 60; private boolean OCREnabled = false; - private boolean limitedOCREnabled = false; private List ocrLanguages = null; private final TimedProcessTerminator ocrTimedTerminator = new TimedProcessTerminator(OCR_TIMEOUT_SECONDS); @@ -58,27 +57,6 @@ public class ImageConfig { return this.OCREnabled; } - /** - * Gets the limited OCR flag to indicate if OCR should be limited to larger - * images and images which were extracted from documents. - * - * @return Flag indicating if limited OCR is enabled. True if OCR should be - * limited, false otherwise.. - */ - public boolean getLimitedOCREnabled() { - return limitedOCREnabled; - } - - /** - * Enables the limiting OCR to be run on larger images and images which were - * extracted from documents. - * - * @param enabled Flag indicating if OCR is enabled. - */ - public void setLimitedOCREnabled(boolean enabled) { - this.limitedOCREnabled = enabled; - } - /** * Sets languages for OCR. Can be null. * diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index c53aaf25d6..93acc280fb 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -321,4 +321,4 @@ ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) -KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Do OCR only +KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index files that use OCR diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 5497bbf67f..3cc31f16db 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -87,6 +87,8 @@ import org.sleuthkit.datamodel.TskData.FileKnown; }) public final class KeywordSearchIngestModule implements FileIngestModule { + private static final int LIMITED_OCR_SIZE_MIN = 100 * 1024; + /** * generally text extractors should ignore archives and let unpacking * modules take care of them @@ -352,10 +354,18 @@ public final class KeywordSearchIngestModule implements FileIngestModule { // if ocr only is enabled and not an ocr file, return Optional extractorOpt = getExtractor(abstractFile); - // if ocr only and the extractor is not present or will not perform ocr on this file, continue - if (settings.isOCREnabled() && settings.isOCROnly() && - (!extractorOpt.isPresent() || !extractorOpt.get().willUseOCR())) { - return ProcessResult.OK; + if (settings.isOCREnabled()) { + // if ocr only and the extractor is not present or will not perform ocr on this file, continue + if (settings.isOCROnly() && (!extractorOpt.isPresent() || !extractorOpt.get().willUseOCR())) { + return ProcessResult.OK; + } + + // if limited ocr is enabled, the extractor will use ocr, and + // the file would not be subject to limited ocr reading, continue + if (settings.isLimitedOCREnabled() && extractorOpt.isPresent() && + extractorOpt.get().willUseOCR() && !isLimitedOCRFile(abstractFile)) { + return ProcessResult.OK; + } } if (KeywordSearchSettings.getSkipKnown() && abstractFile.getKnown().equals(FileKnown.KNOWN)) { @@ -435,6 +445,19 @@ public final class KeywordSearchIngestModule implements FileIngestModule { initialized = false; } + /** + * Returns true if file should have text extracted when limited OCR setting + * is specified. + * + * @param aFile The abstract file. + * + * @return True if file should have text extracted when limited OCR setting + * is on. + */ + private boolean isLimitedOCRFile(AbstractFile aFile) { + return (aFile.getSize() > LIMITED_OCR_SIZE_MIN || ((AbstractFile) aFile).getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED); + } + /** * Posts inbox message with summary of text_ingested files */ @@ -500,7 +523,6 @@ public final class KeywordSearchIngestModule implements FileIngestModule { private Optional getExtractor(AbstractFile abstractFile) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setOCREnabled(settings.isOCREnabled()); - imageConfig.setLimitedOCREnabled(settings.isLimitedOCREnabled()); ProcessTerminator terminator = () -> context.fileIngestIsCancelled(); Lookup extractionContext = Lookups.fixed(imageConfig, terminator); try { diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index de1d92d5af..2ddda6e1af 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -36,21 +36,21 @@ + + + + + + + + + + + + - - - - - - - - - - - - diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index 253e0624de..eb6f3e6c3d 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -39,7 +39,7 @@ import org.sleuthkit.autopsy.keywordsearch.KeywordSearchIngestModule.StringsExtr * Ingest job settings panel for keyword search file ingest modules. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSettingsPanel implements PropertyChangeListener { +public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSettingsPanel implements PropertyChangeListener { private final KeywordListsTableModel tableModel = new KeywordListsTableModel(); private final List keywordListNames = new ArrayList<>(); private final Map keywordListStates = new HashMap<>(); @@ -330,17 +330,17 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGroup(layout.createSequentialGroup() .addComponent(encodingsLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(keywordSearchEncodings))) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(ocrCheckBox) - .addGroup(layout.createSequentialGroup() - .addGap(21, 21, 21) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(limitedOcrCheckbox) - .addComponent(ocrOnlyCheckbox)))) + .addComponent(keywordSearchEncodings)) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(ocrCheckBox) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(limitedOcrCheckbox) + .addComponent(ocrOnlyCheckbox)))) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()))) ); layout.setVerticalGroup( From afcf4c6dc48fe11ed4a2cc0c647732cf947ff382 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 14 Jun 2021 20:13:07 -0400 Subject: [PATCH 06/33] formatting fixes --- .../autopsy/keywordsearch/Bundle.properties | 2 +- .../keywordsearch/Bundle.properties-MERGED | 5 +- .../KeywordSearchJobSettingsPanel.form | 62 ++++++++++--------- .../KeywordSearchJobSettingsPanel.java | 40 ++++++------ 4 files changed, 57 insertions(+), 52 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index 93acc280fb..2e8fc21f3b 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -320,5 +320,5 @@ ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) -KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index files that use OCR diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 8a30223f6b..28af7c4790 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -402,8 +402,9 @@ ExtractedContentPanel.pageTotalLabel.text=- ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: -KeywordSearchGlobalSearchSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) -KeywordSearchGlobalSearchSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) +KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index files that use OCR TextZoomPanel.zoomInButton.text= TextZoomPanel.zoomOutButton.text= TextZoomPanel.zoomResetButton.text=Reset diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index 2ddda6e1af..70d5e64163 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -27,29 +27,24 @@ - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + - @@ -63,22 +58,22 @@ - - - + + + - + - + - + - + - + @@ -111,6 +106,15 @@
+ + + + + + + + + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index eb6f3e6c3d..453ffe4707 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -275,6 +275,9 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe } )); + listsTable.setMaximumSize(new java.awt.Dimension(32767, 32767)); + listsTable.setMinimumSize(new java.awt.Dimension(20, 100)); + listsTable.setPreferredSize(null); listsScrollPane.setViewportView(listsTable); listsTable.setDefaultRenderer(String.class, new SimpleTableCellRenderer()); @@ -323,24 +326,21 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addComponent(languagesLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE) + .addComponent(titleLabel) .addGroup(layout.createSequentialGroup() + .addComponent(encodingsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(keywordSearchEncodings)) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(ocrCheckBox) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(titleLabel) - .addGroup(layout.createSequentialGroup() - .addComponent(encodingsLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(keywordSearchEncodings)) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addComponent(languagesValLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(ocrCheckBox) - .addGroup(layout.createSequentialGroup() - .addGap(21, 21, 21) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(limitedOcrCheckbox) - .addComponent(ocrOnlyCheckbox)))) - .addGap(0, 0, Short.MAX_VALUE))) + .addComponent(ocrOnlyCheckbox) + .addComponent(limitedOcrCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 288, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap()))) ); layout.setVerticalGroup( @@ -349,8 +349,8 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(7, 7, 7) .addComponent(titleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 22, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(languagesValLabel) @@ -358,12 +358,12 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(encodingsLabel) .addComponent(keywordSearchEncodings)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(ocrCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ocrOnlyCheckbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(limitedOcrCheckbox) + .addComponent(limitedOcrCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// //GEN-END:initComponents From cda0cff2b8aadb621024bfc0e4bec7fcf3803802 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 16 Jun 2021 18:44:16 -0400 Subject: [PATCH 07/33] comment updates --- .../autopsy/keywordsearch/KeywordSearchIngestModule.java | 2 +- .../autopsy/keywordsearch/KeywordSearchJobSettings.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 3cc31f16db..13872b8711 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -592,7 +592,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { //divide into chunks and index return Ingester.getDefault().indexText(finalReader, aFile.getId(), aFile.getName(), aFile, context); } catch (TextExtractor.InitReaderException ex) { - //No text extractor found... run the default instead + // Text extractor could not be initialized. No text will be extracted. return false; } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index f6e8a52d73..d051a11705 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -101,7 +101,7 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { } /** - * Returns true if OCR is to be perform only on images larger than 100KB. + * Returns true if OCR is to be performed only on images larger than 100KB. * May defer to KeywordSearchSettings if no setting serialized. * * @return If true, OCR is to be performed only on images larger than 100KB. @@ -112,7 +112,7 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { limitedOCREnabled = KeywordSearchSettings.getLimitedOcrOption(); } - return ocrEnabled; + return limitedOCREnabled; } /** From b697c4c3a9aa280ed318c6cd1348c6a0776c811e Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 17 Jun 2021 11:46:37 -0400 Subject: [PATCH 08/33] working through ocr detection --- .../textextractors/TikaTextExtractor.java | 126 ++++++++++++------ 1 file changed, 82 insertions(+), 44 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 3333894891..143c8b637d 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -71,12 +71,15 @@ import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Set; +import org.apache.tika.extractor.ParsingEmbeddedDocumentExtractor; import org.apache.tika.parser.pdf.PDFParserConfig.OCR_STRATEGY; import org.sleuthkit.autopsy.coreutils.ExecUtil.HybridTerminator; -import org.sleuthkit.datamodel.TskData; +import org.sleuthkit.autopsy.coreutils.FileTypeUtils; /** * Extracts text from Tika supported content. Protects against Tika parser hangs @@ -86,8 +89,8 @@ final class TikaTextExtractor implements TextExtractor { //Mimetype groups to aassist extractor implementations in ignoring binary and //archive files. - private static final List BINARY_MIME_TYPES - = ImmutableList.of( + private static final Set BINARY_MIME_TYPES + = ImmutableSet.of( //ignore binary blob data, for which string extraction will be used "application/octet-stream", //NON-NLS "application/x-msdownload"); //NON-NLS @@ -96,8 +99,8 @@ final class TikaTextExtractor implements TextExtractor { * generally text extractors should ignore archives and let unpacking * modules take care of them */ - private static final List ARCHIVE_MIME_TYPES - = ImmutableList.of( + private static final Set ARCHIVE_MIME_TYPES + = ImmutableSet.of( //ignore unstructured binary and compressed data, for which string extraction or unzipper works better "application/x-7z-compressed", //NON-NLS "application/x-ace-compressed", //NON-NLS @@ -134,6 +137,7 @@ final class TikaTextExtractor implements TextExtractor { // Used to log to the tika file that is why it uses the java.util.logging.logger class instead of the Autopsy one private static final java.util.logging.Logger TIKA_LOGGER = java.util.logging.Logger.getLogger("Tika"); //NON-NLS private static final Logger AUTOPSY_LOGGER = Logger.getLogger(TikaTextExtractor.class.getName()); + private final ThreadFactory tikaThreadFactory = new ThreadFactoryBuilder().setNameFormat("tika-reader-%d").build(); private final ExecutorService executorService = Executors.newSingleThreadExecutor(tikaThreadFactory); @@ -183,17 +187,49 @@ final class TikaTextExtractor implements TextExtractor { */ @Override public boolean willUseOCR() { + return isOcrSupported() + // if limited OCR is not enabled or the image is greater than 100KB in size or the image is a derived file. + && content instanceof AbstractFile + // in order to ocr, it needs to either be an image or a document with embedded content + && (isImage((AbstractFile) content) || isDocumentWithEmbeds((AbstractFile) content)); + } + + private boolean isOcrSupported() { // If Tesseract has been installed and is set to be used through // configuration, then ocr is enabled. OCR can only currently be run on 64 // bit Windows OS. return TESSERACT_PATH != null && tesseractOCREnabled && PlatformUtil.isWindowsOS() - && PlatformUtil.is64BitOS() - // if limited OCR is not enabled or the image is greater than 100KB in size or the image is a derived file. - && content instanceof AbstractFile; + && PlatformUtil.is64BitOS(); + } + + private boolean isImage(AbstractFile aFile) { + String mimeType = aFile.getMIMEType(); + if (mimeType == null) { + return false; + } + + return FileTypeUtils.FileTypeCategory.IMAGE.getMediaTypes().contains(mimeType.toLowerCase()); } + + private boolean isDocumentWithEmbeds(AbstractFile aFile) { + String mimeType = aFile.getMIMEType(); + if (mimeType == null) { + return false; + } + + mimeType = mimeType.toLowerCase(); + + if (ARCHIVE_MIME_TYPES.contains(mimeType)) { + return false; + } + + ParsingEmbeddedDocumentExtractor extractor = new ParsingEmbeddedDocumentExtractor(getParseContext(true)); + extractor.shouldParseEmbedded(metadata) + } + /** * Returns a reader that will iterate over the text extracted from Apache * Tika. @@ -225,42 +261,7 @@ final class TikaTextExtractor implements TextExtractor { // Set up Tika final InputStream stream = new ReadContentInputStream(content); - final ParseContext parseContext = new ParseContext(); - - // Documents can contain other documents. By adding - // the parser back into the context, Tika will recursively - // parse embedded documents. - parseContext.set(Parser.class, parser); - - // Use the more memory efficient Tika SAX parsers for DOCX and - // PPTX files (it already uses SAX for XLSX). - OfficeParserConfig officeParserConfig = new OfficeParserConfig(); - officeParserConfig.setUseSAXPptxExtractor(true); - officeParserConfig.setUseSAXDocxExtractor(true); - parseContext.set(OfficeParserConfig.class, officeParserConfig); - - if (willUseOCR()) { - // Configure OCR for Tika if it chooses to run OCR - // during extraction - TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); - String tesseractFolder = TESSERACT_PATH.getParent(); - ocrConfig.setTesseractPath(tesseractFolder); - ocrConfig.setLanguage(languagePacks); - ocrConfig.setTessdataPath(PlatformUtil.getOcrLanguagePacksPath()); - parseContext.set(TesseractOCRConfig.class, ocrConfig); - - // Configure how Tika handles OCRing PDFs - PDFParserConfig pdfConfig = new PDFParserConfig(); - - // This stategy tries to pick between OCRing a page in the - // PDF and doing text extraction. It makes this choice by - // first running text extraction and then counting characters. - // If there are too few characters or too many unmapped - // unicode characters, it'll run the entire page through OCR - // and take that output instead. See JIRA-6938 - pdfConfig.setOcrStrategy(OCR_STRATEGY.AUTO); - parseContext.set(PDFParserConfig.class, pdfConfig); - } + ParseContext parseContext = getParseContext(); Metadata metadata = new Metadata(); //Make the creation of a TikaReader a cancellable future in case it takes too long @@ -308,6 +309,43 @@ final class TikaTextExtractor implements TextExtractor { } } + private ParseContext getParseContext(boolean ocrEnabled) { + final ParseContext parseContext = new ParseContext(); + // Documents can contain other documents. By adding + // the parser back into the context, Tika will recursively + // parse embedded documents. + parseContext.set(Parser.class, parser); + // Use the more memory efficient Tika SAX parsers for DOCX and + // PPTX files (it already uses SAX for XLSX). + OfficeParserConfig officeParserConfig = new OfficeParserConfig(); + officeParserConfig.setUseSAXPptxExtractor(true); + officeParserConfig.setUseSAXDocxExtractor(true); + parseContext.set(OfficeParserConfig.class, officeParserConfig); + if (ocrEnabled) { + // Configure OCR for Tika if it chooses to run OCR + // during extraction + TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); + String tesseractFolder = TESSERACT_PATH.getParent(); + ocrConfig.setTesseractPath(tesseractFolder); + ocrConfig.setLanguage(languagePacks); + ocrConfig.setTessdataPath(PlatformUtil.getOcrLanguagePacksPath()); + parseContext.set(TesseractOCRConfig.class, ocrConfig); + + // Configure how Tika handles OCRing PDFs + PDFParserConfig pdfConfig = new PDFParserConfig(); + + // This stategy tries to pick between OCRing a page in the + // PDF and doing text extraction. It makes this choice by + // first running text extraction and then counting characters. + // If there are too few characters or too many unmapped + // unicode characters, it'll run the entire page through OCR + // and take that output instead. See JIRA-6938 + pdfConfig.setOcrStrategy(OCR_STRATEGY.AUTO); + parseContext.set(PDFParserConfig.class, pdfConfig); + } + return parseContext; + } + /** * Run OCR and return the file stream produced by Tesseract. * From c32764467429e71261e77916105138a04c32b430 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 17 Jun 2021 15:29:57 -0400 Subject: [PATCH 09/33] updates for tika text extractor --- .../textextractors/TikaTextExtractor.java | 83 +++++++++++++------ .../autopsy/keywordsearch/Bundle.properties | 2 +- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 143c8b637d..475e875bfb 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -75,8 +75,18 @@ import com.google.common.collect.ImmutableSet; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Optional; import java.util.Set; -import org.apache.tika.extractor.ParsingEmbeddedDocumentExtractor; +import org.apache.tika.mime.MediaType; +import org.apache.tika.parser.mail.RFC822Parser; +import org.apache.tika.parser.mbox.MboxParser; +import org.apache.tika.parser.mbox.OutlookPSTParser; +import org.apache.tika.parser.microsoft.OfficeParser; +import org.apache.tika.parser.epub.EpubParser; +import org.apache.tika.parser.microsoft.TNEFParser; +import org.apache.tika.parser.microsoft.ooxml.OOXMLParser; +import org.apache.tika.parser.odf.OpenDocumentParser; +import org.apache.tika.parser.pdf.PDFParser; import org.apache.tika.parser.pdf.PDFParserConfig.OCR_STRATEGY; import org.sleuthkit.autopsy.coreutils.ExecUtil.HybridTerminator; import org.sleuthkit.autopsy.coreutils.FileTypeUtils; @@ -134,6 +144,21 @@ final class TikaTextExtractor implements TextExtractor { "application/x-z", //NON-NLS "application/x-compress"); //NON-NLS + private static final List DOCUMENTS_WITH_EMBEDS_PARSERS = ImmutableList.of( + new OpenDocumentParser(), + new OOXMLParser(), + new OfficeParser(), + + new PDFParser(), + + new EpubParser(), + + new MboxParser(), + new RFC822Parser(), + new OutlookPSTParser(), + new TNEFParser() + ); + // Used to log to the tika file that is why it uses the java.util.logging.logger class instead of the Autopsy one private static final java.util.logging.Logger TIKA_LOGGER = java.util.logging.Logger.getLogger("Tika"); //NON-NLS private static final Logger AUTOPSY_LOGGER = Logger.getLogger(TikaTextExtractor.class.getName()); @@ -166,25 +191,6 @@ final class TikaTextExtractor implements TextExtractor { this.content = content; } - /** - * If Tesseract has been installed and is set to be used through - * configuration, then ocr is enabled. OCR can only currently be run on 64 - * bit Windows OS. - * - * @return Flag indicating if OCR is set to be used. - */ - /** - * Method to indicate if OCR should be performed on this image file. Checks - * to see if the limited OCR setting is enabled. If it is it will also check - * that one of the limiting factors is true. - * - * @param file The AbstractFile which OCR might be performed on. - * @param boolean The configuration setting which indicates if limited OCR - * is enabled in Keyword Search. - * - * @return True if limited OCR is not enabled or the image is greater than - * 100KB in size or the image is a derived file. - */ @Override public boolean willUseOCR() { return isOcrSupported() @@ -193,7 +199,11 @@ final class TikaTextExtractor implements TextExtractor { // in order to ocr, it needs to either be an image or a document with embedded content && (isImage((AbstractFile) content) || isDocumentWithEmbeds((AbstractFile) content)); } - + + /** + * Whether or not OCR is supported in environment. + * @return True if OCR is supported. + */ private boolean isOcrSupported() { // If Tesseract has been installed and is set to be used through // configuration, then ocr is enabled. OCR can only currently be run on 64 @@ -204,6 +214,11 @@ final class TikaTextExtractor implements TextExtractor { && PlatformUtil.is64BitOS(); } + /** + * Returns whether or not the file is a known image. + * @param aFile The abstract file. + * @return True if mime type is an image type. + */ private boolean isImage(AbstractFile aFile) { String mimeType = aFile.getMIMEType(); if (mimeType == null) { @@ -214,6 +229,11 @@ final class TikaTextExtractor implements TextExtractor { } + /** + * Whether or not file is a document type known to have embedded images. + * @param aFile The abstract file. + * @return True if document type with possible image embeds. + */ private boolean isDocumentWithEmbeds(AbstractFile aFile) { String mimeType = aFile.getMIMEType(); if (mimeType == null) { @@ -226,8 +246,14 @@ final class TikaTextExtractor implements TextExtractor { return false; } - ParsingEmbeddedDocumentExtractor extractor = new ParsingEmbeddedDocumentExtractor(getParseContext(true)); - extractor.shouldParseEmbedded(metadata) + MediaType mediaType = MediaType.parse(mimeType); + + ParseContext parseContext = getParseContext(true); + Optional parserOpt = DOCUMENTS_WITH_EMBEDS_PARSERS.stream() + .filter((p) -> p.getSupportedTypes(parseContext).contains(mediaType)) + .findFirst(); + + return parserOpt.isPresent(); } /** @@ -249,19 +275,17 @@ final class TikaTextExtractor implements TextExtractor { // Only abstract files are supported, see isSupported() final AbstractFile file = ((AbstractFile) content); - // This mime type must be non-null, see isSupported() - final String mimeType = file.getMIMEType(); // Handle images seperately so the OCR task can be cancelled. // See JIRA-4519 for the need to have cancellation in the UI and ingest. - if (willUseOCR() && mimeType.toLowerCase().startsWith("image/")) { + if (isOcrSupported() && isImage(file)) { InputStream imageOcrStream = performOCR(file); return new InputStreamReader(imageOcrStream, Charset.forName("UTF-8")); } // Set up Tika final InputStream stream = new ReadContentInputStream(content); - ParseContext parseContext = getParseContext(); + ParseContext parseContext = getParseContext(isOcrSupported()); Metadata metadata = new Metadata(); //Make the creation of a TikaReader a cancellable future in case it takes too long @@ -309,6 +333,11 @@ final class TikaTextExtractor implements TextExtractor { } } + /** + * Returns a parse context to be used. + * @param ocrEnabled Whether or not OCR is enabled. + * @return The generated ParseContext. + */ private ParseContext getParseContext(boolean ocrEnabled) { final ParseContext parseContext = new ParseContext(); // Documents can contain other documents. By adding diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index 2e8fc21f3b..def874f21a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -321,4 +321,4 @@ ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) -KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index files that use OCR +KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index text extracted using OCR From 61cefbb607ada51227248dbd82469af54325841d Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 17 Jun 2021 15:44:39 -0400 Subject: [PATCH 10/33] bundle update --- .../sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 28af7c4790..5d09c26249 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -52,7 +52,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search @@ -404,7 +404,7 @@ ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) -KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index files that use OCR +KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index text extracted using OCR TextZoomPanel.zoomInButton.text= TextZoomPanel.zoomOutButton.text= TextZoomPanel.zoomResetButton.text=Reset From e2962128f766125b22dc4c9a0429b3b4a237e4e1 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 18 Jun 2021 12:08:39 -0400 Subject: [PATCH 11/33] updates in business logic --- .../textextractors/TikaTextExtractor.java | 190 +++++++----------- .../KeywordSearchIngestModule.java | 31 +-- 2 files changed, 90 insertions(+), 131 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 475e875bfb..aabbfeafc7 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.textextractors; -import com.google.common.collect.ImmutableList; import com.google.common.io.CharSource; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.io.File; @@ -75,21 +74,11 @@ import com.google.common.collect.ImmutableSet; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Optional; import java.util.Set; -import org.apache.tika.mime.MediaType; -import org.apache.tika.parser.mail.RFC822Parser; -import org.apache.tika.parser.mbox.MboxParser; -import org.apache.tika.parser.mbox.OutlookPSTParser; -import org.apache.tika.parser.microsoft.OfficeParser; -import org.apache.tika.parser.epub.EpubParser; -import org.apache.tika.parser.microsoft.TNEFParser; -import org.apache.tika.parser.microsoft.ooxml.OOXMLParser; -import org.apache.tika.parser.odf.OpenDocumentParser; -import org.apache.tika.parser.pdf.PDFParser; +import org.apache.tika.mime.MimeTypes; import org.apache.tika.parser.pdf.PDFParserConfig.OCR_STRATEGY; import org.sleuthkit.autopsy.coreutils.ExecUtil.HybridTerminator; -import org.sleuthkit.autopsy.coreutils.FileTypeUtils; +import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; /** * Extracts text from Tika supported content. Protects against Tika parser hangs @@ -144,21 +133,6 @@ final class TikaTextExtractor implements TextExtractor { "application/x-z", //NON-NLS "application/x-compress"); //NON-NLS - private static final List DOCUMENTS_WITH_EMBEDS_PARSERS = ImmutableList.of( - new OpenDocumentParser(), - new OOXMLParser(), - new OfficeParser(), - - new PDFParser(), - - new EpubParser(), - - new MboxParser(), - new RFC822Parser(), - new OutlookPSTParser(), - new TNEFParser() - ); - // Used to log to the tika file that is why it uses the java.util.logging.logger class instead of the Autopsy one private static final java.util.logging.Logger TIKA_LOGGER = java.util.logging.Logger.getLogger("Tika"); //NON-NLS private static final Logger AUTOPSY_LOGGER = Logger.getLogger(TikaTextExtractor.class.getName()); @@ -169,6 +143,7 @@ final class TikaTextExtractor implements TextExtractor { private static final String SQLITE_MIMETYPE = "application/x-sqlite3"; private final AutoDetectParser parser = new AutoDetectParser(); + private final FileTypeDetector fileTypeDetector; private final Content content; private boolean tesseractOCREnabled; @@ -177,6 +152,10 @@ final class TikaTextExtractor implements TextExtractor { private static final File TESSERACT_PATH = locateTesseractExecutable(); private String languagePacks = formatLanguagePacks(PlatformUtil.getOcrLanguagePacks()); private static final String TESSERACT_OUTPUT_FILE_NAME = "tess_output"; //NON-NLS + + private static final String PDF_MIME_TYPE = "application/pdf"; + private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; + private Map metadataMap; private ProcessTerminator processTerminator; @@ -189,19 +168,41 @@ final class TikaTextExtractor implements TextExtractor { TikaTextExtractor(Content content) { this.content = content; + + FileTypeDetector detector = null; + try { + detector = new FileTypeDetector(); + } catch (FileTypeDetector.FileTypeDetectorInitException ex) { + TIKA_LOGGER.log(Level.SEVERE, "Unable to instantiate a file type detector", ex); + } + this.fileTypeDetector = detector; + } + + private String getMimeType(AbstractFile file) { + String mimeType = MimeTypes.OCTET_STREAM; + if (fileTypeDetector != null) { + mimeType = fileTypeDetector.getMIMEType(file); + } else if (file.getMIMEType() != null) { + mimeType = file.getMIMEType(); + } + + return mimeType.trim().toLowerCase(); } @Override public boolean willUseOCR() { - return isOcrSupported() - // if limited OCR is not enabled or the image is greater than 100KB in size or the image is a derived file. - && content instanceof AbstractFile - // in order to ocr, it needs to either be an image or a document with embedded content - && (isImage((AbstractFile) content) || isDocumentWithEmbeds((AbstractFile) content)); + if (!isOcrSupported() || (!(content instanceof AbstractFile))) { + return false; + } + + String mimeType = getMimeType((AbstractFile) content); + // in order to ocr, it needs to either be an image or a document with embedded content + return mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX) || PDF_MIME_TYPE.equals(mimeType); } /** * Whether or not OCR is supported in environment. + * * @return True if OCR is supported. */ private boolean isOcrSupported() { @@ -213,49 +214,7 @@ final class TikaTextExtractor implements TextExtractor { && PlatformUtil.isWindowsOS() && PlatformUtil.is64BitOS(); } - - /** - * Returns whether or not the file is a known image. - * @param aFile The abstract file. - * @return True if mime type is an image type. - */ - private boolean isImage(AbstractFile aFile) { - String mimeType = aFile.getMIMEType(); - if (mimeType == null) { - return false; - } - - return FileTypeUtils.FileTypeCategory.IMAGE.getMediaTypes().contains(mimeType.toLowerCase()); - } - - /** - * Whether or not file is a document type known to have embedded images. - * @param aFile The abstract file. - * @return True if document type with possible image embeds. - */ - private boolean isDocumentWithEmbeds(AbstractFile aFile) { - String mimeType = aFile.getMIMEType(); - if (mimeType == null) { - return false; - } - - mimeType = mimeType.toLowerCase(); - - if (ARCHIVE_MIME_TYPES.contains(mimeType)) { - return false; - } - - MediaType mediaType = MediaType.parse(mimeType); - - ParseContext parseContext = getParseContext(true); - Optional parserOpt = DOCUMENTS_WITH_EMBEDS_PARSERS.stream() - .filter((p) -> p.getSupportedTypes(parseContext).contains(mediaType)) - .findFirst(); - - return parserOpt.isPresent(); - } - /** * Returns a reader that will iterate over the text extracted from Apache * Tika. @@ -276,16 +235,51 @@ final class TikaTextExtractor implements TextExtractor { // Only abstract files are supported, see isSupported() final AbstractFile file = ((AbstractFile) content); + String mimeType = getMimeType(file); + // Handle images seperately so the OCR task can be cancelled. // See JIRA-4519 for the need to have cancellation in the UI and ingest. - if (isOcrSupported() && isImage(file)) { + if (isOcrSupported() && mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX)) { InputStream imageOcrStream = performOCR(file); return new InputStreamReader(imageOcrStream, Charset.forName("UTF-8")); } // Set up Tika final InputStream stream = new ReadContentInputStream(content); - ParseContext parseContext = getParseContext(isOcrSupported()); + + final ParseContext parseContext = new ParseContext(); + // Documents can contain other documents. By adding + // the parser back into the context, Tika will recursively + // parse embedded documents. + parseContext.set(Parser.class, parser); + // Use the more memory efficient Tika SAX parsers for DOCX and + // PPTX files (it already uses SAX for XLSX). + OfficeParserConfig officeParserConfig = new OfficeParserConfig(); + officeParserConfig.setUseSAXPptxExtractor(true); + officeParserConfig.setUseSAXDocxExtractor(true); + parseContext.set(OfficeParserConfig.class, officeParserConfig); + if (isOcrSupported()) { + // Configure OCR for Tika if it chooses to run OCR + // during extraction + TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); + String tesseractFolder = TESSERACT_PATH.getParent(); + ocrConfig.setTesseractPath(tesseractFolder); + ocrConfig.setLanguage(languagePacks); + ocrConfig.setTessdataPath(PlatformUtil.getOcrLanguagePacksPath()); + parseContext.set(TesseractOCRConfig.class, ocrConfig); + + // Configure how Tika handles OCRing PDFs + PDFParserConfig pdfConfig = new PDFParserConfig(); + + // This stategy tries to pick between OCRing a page in the + // PDF and doing text extraction. It makes this choice by + // first running text extraction and then counting characters. + // If there are too few characters or too many unmapped + // unicode characters, it'll run the entire page through OCR + // and take that output instead. See JIRA-6938 + pdfConfig.setOcrStrategy(OCR_STRATEGY.AUTO); + parseContext.set(PDFParserConfig.class, pdfConfig); + } Metadata metadata = new Metadata(); //Make the creation of a TikaReader a cancellable future in case it takes too long @@ -333,48 +327,6 @@ final class TikaTextExtractor implements TextExtractor { } } - /** - * Returns a parse context to be used. - * @param ocrEnabled Whether or not OCR is enabled. - * @return The generated ParseContext. - */ - private ParseContext getParseContext(boolean ocrEnabled) { - final ParseContext parseContext = new ParseContext(); - // Documents can contain other documents. By adding - // the parser back into the context, Tika will recursively - // parse embedded documents. - parseContext.set(Parser.class, parser); - // Use the more memory efficient Tika SAX parsers for DOCX and - // PPTX files (it already uses SAX for XLSX). - OfficeParserConfig officeParserConfig = new OfficeParserConfig(); - officeParserConfig.setUseSAXPptxExtractor(true); - officeParserConfig.setUseSAXDocxExtractor(true); - parseContext.set(OfficeParserConfig.class, officeParserConfig); - if (ocrEnabled) { - // Configure OCR for Tika if it chooses to run OCR - // during extraction - TesseractOCRConfig ocrConfig = new TesseractOCRConfig(); - String tesseractFolder = TESSERACT_PATH.getParent(); - ocrConfig.setTesseractPath(tesseractFolder); - ocrConfig.setLanguage(languagePacks); - ocrConfig.setTessdataPath(PlatformUtil.getOcrLanguagePacksPath()); - parseContext.set(TesseractOCRConfig.class, ocrConfig); - - // Configure how Tika handles OCRing PDFs - PDFParserConfig pdfConfig = new PDFParserConfig(); - - // This stategy tries to pick between OCRing a page in the - // PDF and doing text extraction. It makes this choice by - // first running text extraction and then counting characters. - // If there are too few characters or too many unmapped - // unicode characters, it'll run the entire page through OCR - // and take that output instead. See JIRA-6938 - pdfConfig.setOcrStrategy(OCR_STRATEGY.AUTO); - parseContext.set(PDFParserConfig.class, pdfConfig); - } - return parseContext; - } - /** * Run OCR and return the file stream produced by Tesseract. * diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 13872b8711..7345c1e774 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -147,6 +147,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { .put("pdf:PDFVersion", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VERSION) .build(); + private static final String PDF_MIME_TYPE = "application/pdf"; + /** * Options for this extractor */ @@ -354,6 +356,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { // if ocr only is enabled and not an ocr file, return Optional extractorOpt = getExtractor(abstractFile); + String mimeType = fileTypeDetector.getMIMEType(abstractFile).trim().toLowerCase(); + if (settings.isOCREnabled()) { // if ocr only and the extractor is not present or will not perform ocr on this file, continue if (settings.isOCROnly() && (!extractorOpt.isPresent() || !extractorOpt.get().willUseOCR())) { @@ -362,8 +366,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { // if limited ocr is enabled, the extractor will use ocr, and // the file would not be subject to limited ocr reading, continue - if (settings.isLimitedOCREnabled() && extractorOpt.isPresent() && - extractorOpt.get().willUseOCR() && !isLimitedOCRFile(abstractFile)) { + if (settings.isLimitedOCREnabled() && extractorOpt.isPresent() + && extractorOpt.get().willUseOCR() && !isLimitedOCRFile(abstractFile, mimeType)) { return ProcessResult.OK; } } @@ -373,7 +377,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - indexer.indexFile(extractorOpt, abstractFile, false); + indexer.indexFile(extractorOpt, abstractFile, mimeType, false); return ProcessResult.OK; } @@ -381,7 +385,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - indexer.indexFile(extractorOpt, abstractFile, true); + indexer.indexFile(extractorOpt, abstractFile, mimeType, true); // Start searching if it hasn't started already if (!startedSearching) { @@ -449,13 +453,16 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * Returns true if file should have text extracted when limited OCR setting * is specified. * - * @param aFile The abstract file. + * @param aFile The abstract file. + * @param mimeType The file mime type. * * @return True if file should have text extracted when limited OCR setting * is on. */ - private boolean isLimitedOCRFile(AbstractFile aFile) { - return (aFile.getSize() > LIMITED_OCR_SIZE_MIN || ((AbstractFile) aFile).getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED); + private boolean isLimitedOCRFile(AbstractFile aFile, String mimeType) { + return aFile.getSize() > LIMITED_OCR_SIZE_MIN + || aFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED + || PDF_MIME_TYPE.equals(mimeType); } /** @@ -712,11 +719,12 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * * @param extractor The textExtractor to use with this file or empty * if no extractor found. - * @param aFile File to analyze + * @param aFile File to analyze. + * @param mimeType The file mime type. * @param indexContent False if only metadata should be text_ingested. * True if content and metadata should be index. */ - private void indexFile(Optional extractor, AbstractFile aFile, boolean indexContent) { + private void indexFile(Optional extractor, AbstractFile aFile, String mimeType, boolean indexContent) { //logger.log(Level.INFO, "Processing AbstractFile: " + abstractFile.getName()); TskData.TSK_DB_FILES_TYPE_ENUM aType = aFile.getType(); @@ -758,11 +766,10 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (context.fileIngestIsCancelled()) { return; } - String fileType = fileTypeDetector.getMIMEType(aFile); // we skip archive formats that are opened by the archive module. // @@@ We could have a check here to see if the archive module was enabled though... - if (ARCHIVE_MIME_TYPES.contains(fileType)) { + if (ARCHIVE_MIME_TYPES.contains(mimeType)) { try { if (context.fileIngestIsCancelled()) { return; @@ -785,7 +792,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { if (context.fileIngestIsCancelled()) { return; } - if (fileType.equals(MimeTypes.OCTET_STREAM)) { + if (MimeTypes.OCTET_STREAM.equals(mimeType)) { extractStringsAndIndex(aFile); return; } From f2b9bc8bbbfcf8d64249d852c076a0c511700fe0 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 18 Jun 2021 14:26:09 -0400 Subject: [PATCH 12/33] changes to business logic --- .../keywordsearch/KeywordSearchIngestModule.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 7345c1e774..4fc6f90ff3 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -460,9 +460,16 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * is on. */ private boolean isLimitedOCRFile(AbstractFile aFile, String mimeType) { - return aFile.getSize() > LIMITED_OCR_SIZE_MIN - || aFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED - || PDF_MIME_TYPE.equals(mimeType); + if (PDF_MIME_TYPE.equals(mimeType)) { + return true; + } + + if (mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX)) { + return aFile.getSize() > LIMITED_OCR_SIZE_MIN + || aFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.DERIVED; + } + + return false; } /** From 6f7ba33863bd1918247484faeb6297e64c20edb3 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 18 Jun 2021 15:19:24 -0400 Subject: [PATCH 13/33] fix --- .../autopsy/keywordsearch/KeywordSearchIngestModule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 4fc6f90ff3..d35d6e38c0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -149,6 +149,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { private static final String PDF_MIME_TYPE = "application/pdf"; + private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; + /** * Options for this extractor */ From 5d73e14d66db9f0a322bd1379be053ea85bca8af Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 21 Jun 2021 07:50:20 -0400 Subject: [PATCH 14/33] include docx --- .../textextractors/TikaTextExtractor.java | 9 +++++++-- .../KeywordSearchIngestModule.java | 17 +++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index aabbfeafc7..1d63884d34 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -153,7 +153,12 @@ final class TikaTextExtractor implements TextExtractor { private String languagePacks = formatLanguagePacks(PlatformUtil.getOcrLanguagePacks()); private static final String TESSERACT_OUTPUT_FILE_NAME = "tess_output"; //NON-NLS - private static final String PDF_MIME_TYPE = "application/pdf"; + // documents where OCR is performed + private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( + "application/pdf", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ); + private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; private Map metadataMap; @@ -197,7 +202,7 @@ final class TikaTextExtractor implements TextExtractor { String mimeType = getMimeType((AbstractFile) content); // in order to ocr, it needs to either be an image or a document with embedded content - return mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX) || PDF_MIME_TYPE.equals(mimeType); + return mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX) || OCR_DOCUMENTS.contains(mimeType); } /** diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index d35d6e38c0..53c4bbe041 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.keywordsearch; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.io.CharSource; import java.io.IOException; import java.io.Reader; @@ -147,10 +148,14 @@ public final class KeywordSearchIngestModule implements FileIngestModule { .put("pdf:PDFVersion", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VERSION) .build(); - private static final String PDF_MIME_TYPE = "application/pdf"; - private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; + // documents where OCR is performed + private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( + "application/pdf", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ); + /** * Options for this extractor */ @@ -452,8 +457,8 @@ public final class KeywordSearchIngestModule implements FileIngestModule { } /** - * Returns true if file should have text extracted when limited OCR setting - * is specified. + * Returns true if file should have OCR performed on it when limited OCR + * setting is specified. * * @param aFile The abstract file. * @param mimeType The file mime type. @@ -462,9 +467,9 @@ public final class KeywordSearchIngestModule implements FileIngestModule { * is on. */ private boolean isLimitedOCRFile(AbstractFile aFile, String mimeType) { - if (PDF_MIME_TYPE.equals(mimeType)) { + if (OCR_DOCUMENTS.contains(mimeType)) { return true; - } + } if (mimeType.startsWith(IMAGE_MIME_TYPE_PREFIX)) { return aFile.getSize() > LIMITED_OCR_SIZE_MIN From 4bced419121660ba30ae6baba4e8ecb1b06cd1ee Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 21 Jun 2021 18:34:47 -0400 Subject: [PATCH 15/33] auto ingest fixes --- .../KeywordSearchService.java | 10 ------- .../autoingest/AutoIngestManager.java | 29 ++++++++++++------- .../KeywordSearchJobSettings.java | 6 ++-- .../keywordsearch/SolrSearchService.java | 14 --------- 4 files changed, 21 insertions(+), 38 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java b/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java index 7d197a4d11..6c2997ccec 100644 --- a/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java +++ b/Core/src/org/sleuthkit/autopsy/keywordsearchservice/KeywordSearchService.java @@ -106,14 +106,4 @@ public interface KeywordSearchService extends Closeable { * @throws KeywordSearchServiceException if unable to delete. */ void deleteDataSource(Long dataSourceId) throws KeywordSearchServiceException; - - /** - * A flag to enable or disable OCR on all future text indexing. - * - * @param state Boolean flag to enable/disable OCR. Set to True to enable - * OCR, or False to disable it. - */ - @Beta - void changeOcrState(boolean state); - } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index c7eb4111bf..361a071f0b 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -105,11 +105,11 @@ import org.sleuthkit.autopsy.ingest.IngestModuleError; import org.sleuthkit.autopsy.ingest.IngestStream; import org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleException; import org.sleuthkit.autopsy.keywordsearch.Server; -import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.autopsy.keywordsearch.KeywordSearchJobSettings; /** * An auto ingest manager is responsible for processing auto ingest jobs defined @@ -2295,15 +2295,6 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen currentJob.setProcessingStage(AutoIngestJob.Stage.UPDATING_SHARED_CONFIG, Date.from(Instant.now())); new SharedConfiguration().downloadConfiguration(); } - - // update the OCR enabled/disabled setting - if (currentJob.getOcrEnabled()) { - sysLogger.log(Level.INFO, "Enabling OCR for job {0}", currentJob.getManifest().getFilePath()); - } else { - sysLogger.log(Level.INFO, "Disabling OCR for job {0}", currentJob.getManifest().getFilePath()); - } - KeywordSearchService kwsService = Lookup.getDefault().lookup(KeywordSearchService.class); - kwsService.changeOcrState(currentJob.getOcrEnabled()); } /** @@ -2753,7 +2744,8 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen sysLogger.log(Level.WARNING, "Cancellation while waiting for data source processor for {0}", manifestPath); jobLogger.logDataSourceProcessorCancelled(); } - } + } + /** * Analyzes the data source content returned by the data source @@ -2798,6 +2790,20 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen throw new AnalysisStartupException("Error(s) in ingest job settings"); } + // update the OCR enabled/disabled setting + if (currentJob.getOcrEnabled()) { + sysLogger.log(Level.INFO, "Enabling OCR for job {0}", currentJob.getManifest().getFilePath()); + } else { + sysLogger.log(Level.INFO, "Disabling OCR for job {0}", currentJob.getManifest().getFilePath()); + } + + // find the KeywordSearchJobSettings instance in the templates, and if present, set ocr enabled + ingestJobSettings.getIngestModuleTemplates().stream() + .filter(template -> template.getModuleSettings() instanceof KeywordSearchJobSettings) + .map(template -> (KeywordSearchJobSettings) template.getModuleSettings()) + .findFirst() + .ifPresent((keywordJobSettings) -> keywordJobSettings.setOCREnabled(currentJob.getOcrEnabled())); + ingestJobStartResult = IngestManager.getInstance().beginIngestJob(dataSource.getContent(), ingestJobSettings); ingestJob = ingestJobStartResult.getJob(); @@ -2861,6 +2867,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen currentJob.setIngestJob(null); } } + /** * Gather metrics to store in auto ingest job nodes. A SleuthkitCase diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index d051a11705..5969a9d7c0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -26,7 +26,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; /** * Ingest job settings for the keywords search module. */ -final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { +public final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { private static final long serialVersionUID = 1L; @@ -83,7 +83,7 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * @return Whether or not OCR is enabled for keyword search. */ @SuppressWarnings("Deprecation") - boolean isOCREnabled() { + public boolean isOCREnabled() { if (ocrEnabled == null) { ocrEnabled = KeywordSearchSettings.getOcrOption(); } @@ -96,7 +96,7 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { * * @param ocrEnabled Whether or not OCR is enabled for keyword search. */ - void setOCREnabled(boolean ocrEnabled) { + public void setOCREnabled(boolean ocrEnabled) { this.ocrEnabled = ocrEnabled; } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java index 09460a0788..5d793b82a2 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java @@ -461,18 +461,4 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { throw new TskCoreException(ex.getCause().getMessage(), ex); } } - - /** - * A flag to enable or disable OCR on all future text indexing. Also sets the - * the "Limited OCR" functionality accordingly. - * - * @param state Boolean flag to enable/disable OCR. Set to True to enable - * OCR, or False to disable it. - */ - @Override - public void changeOcrState(boolean state) { - KeywordSearchSettings.setOcrOption(state); - KeywordSearchSettings.setLimitedOcrOption(state); - } - } From 8c1b7feb945f3fa2f9a27382021d03fb614cfdc8 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 21 Jun 2021 18:40:43 -0400 Subject: [PATCH 16/33] warning fixes --- .../autopsy/keywordsearch/KeywordSearchIngestModule.java | 2 +- .../autopsy/keywordsearch/KeywordSearchJobSettings.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 53c4bbe041..4afd75a542 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -151,7 +151,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule { private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; // documents where OCR is performed - private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( + private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( "application/pdf", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index 5969a9d7c0..826005f7d0 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -82,7 +82,7 @@ public final class KeywordSearchJobSettings implements IngestModuleIngestJobSett * * @return Whether or not OCR is enabled for keyword search. */ - @SuppressWarnings("Deprecation") + @SuppressWarnings("deprecation") public boolean isOCREnabled() { if (ocrEnabled == null) { ocrEnabled = KeywordSearchSettings.getOcrOption(); @@ -106,7 +106,7 @@ public final class KeywordSearchJobSettings implements IngestModuleIngestJobSett * * @return If true, OCR is to be performed only on images larger than 100KB. */ - @SuppressWarnings("Deprecation") + @SuppressWarnings("deprecation") boolean isLimitedOCREnabled() { if (limitedOCREnabled == null) { limitedOCREnabled = KeywordSearchSettings.getLimitedOcrOption(); From 8293b38d1aaad4326a99804e54332555357a2d2f Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 22 Jun 2021 09:22:58 -0400 Subject: [PATCH 17/33] commenting --- .../autopsy/textextractors/TikaTextExtractor.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 1d63884d34..df103c7441 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -158,7 +158,7 @@ final class TikaTextExtractor implements TextExtractor { "application/pdf", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ); - + private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; private Map metadataMap; @@ -183,6 +183,16 @@ final class TikaTextExtractor implements TextExtractor { this.fileTypeDetector = detector; } + /** + * Obtains the mime type of the file using a FileTypeDetector with the + * file's mime type as fallback if the FileTypeDetector is not instantiated. + * If no mime type present, MimeTypes.OCTET_STREAM is returned. + * + * @param file The abstract file instance. + * + * @return The mime type or MimeTypes.OCTET_STREAM if the mime type cannot + * be determined. + */ private String getMimeType(AbstractFile file) { String mimeType = MimeTypes.OCTET_STREAM; if (fileTypeDetector != null) { From 9c789fe4fd2e4e3f9a61ad59d29b23c2bae78cc6 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 30 Jun 2021 10:50:28 -0400 Subject: [PATCH 18/33] UI fixes and isOcrSupported --- .../autopsy/textextractors/TikaTextExtractor.java | 3 ++- .../sleuthkit/autopsy/keywordsearch/Bundle.properties | 2 +- .../keywordsearch/KeywordSearchJobSettingsPanel.form | 8 ++++---- .../keywordsearch/KeywordSearchJobSettingsPanel.java | 10 +++++++--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index df103c7441..255c3d5d55 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -227,7 +227,8 @@ final class TikaTextExtractor implements TextExtractor { return TESSERACT_PATH != null && tesseractOCREnabled && PlatformUtil.isWindowsOS() - && PlatformUtil.is64BitOS(); + && PlatformUtil.is64BitOS() + && isSupported(); } /** diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index def874f21a..831379e537 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -320,5 +320,5 @@ ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pagesLabel.text=Page: KeywordSearchJobSettingsPanel.ocrCheckBox.text=Enable Optical Character Recognition (OCR) -KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process images which are over 100KB in size or extracted from a document (Beta) +KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text=Only process PDFs, MS Office docs and images which are over 100KB in size or extracted from another file (Beta) KeywordSearchJobSettingsPanel.ocrOnlyCheckbox.text=Only index text extracted using OCR diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index 70d5e64163..af6b538b99 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -59,9 +59,9 @@ - - - + + + @@ -110,7 +110,7 @@ - + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index 453ffe4707..68a4b80f70 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -86,6 +86,10 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe displayEncodings(); keywordListsManager.addPropertyChangeListener(this); languagesLabel.setText("" + org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.languagesLabel.text") + ""); // NOI18N NON-NLS + + // the gui builder does not explicitly set these to false. + listsTable.setShowHorizontalLines(false); + listsTable.setShowVerticalLines(false); } private void customizeKeywordListsTable() { @@ -276,7 +280,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe } )); listsTable.setMaximumSize(new java.awt.Dimension(32767, 32767)); - listsTable.setMinimumSize(new java.awt.Dimension(20, 100)); + listsTable.setMinimumSize(new java.awt.Dimension(20, 200)); listsTable.setPreferredSize(null); listsScrollPane.setViewportView(listsTable); listsTable.setDefaultRenderer(String.class, new SimpleTableCellRenderer()); @@ -349,9 +353,9 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(7, 7, 7) .addComponent(titleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 22, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 13, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(languagesValLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) From 6f2e18a574764db3133e01d0c2f5c25a0d576134 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 30 Jun 2021 11:57:55 -0400 Subject: [PATCH 19/33] checkbox vertical positioning --- .../autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form | 3 ++- .../autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form index af6b538b99..0294690848 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.form @@ -59,7 +59,7 @@ - + @@ -182,6 +182,7 @@ + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java index 68a4b80f70..6bf036000a 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettingsPanel.java @@ -307,6 +307,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe }); limitedOcrCheckbox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.limitedOcrCheckbox.text")); // NOI18N + limitedOcrCheckbox.setVerticalTextPosition(javax.swing.SwingConstants.TOP); limitedOcrCheckbox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { limitedOcrCheckboxActionPerformed(evt); @@ -353,7 +354,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe .addGap(7, 7, 7) .addComponent(titleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 22, Short.MAX_VALUE) + .addComponent(listsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(languagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 13, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) From 8c92217a0da065345f5aef4a7d16b7bd1cb0ff34 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 1 Jul 2021 08:30:37 -0400 Subject: [PATCH 20/33] office mime types --- .../autopsy/textextractors/TikaTextExtractor.java | 7 ++++++- .../autopsy/keywordsearch/KeywordSearchIngestModule.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java index 255c3d5d55..470c0f8cf4 100644 --- a/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/textextractors/TikaTextExtractor.java @@ -156,7 +156,12 @@ final class TikaTextExtractor implements TextExtractor { // documents where OCR is performed private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( "application/pdf", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ); private static final String IMAGE_MIME_TYPE_PREFIX = "image/"; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 4afd75a542..d350bfea6d 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -153,7 +153,12 @@ public final class KeywordSearchIngestModule implements FileIngestModule { // documents where OCR is performed private static final ImmutableSet OCR_DOCUMENTS = ImmutableSet.of( "application/pdf", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ); /** From f44c6ad89c09f96506a704159464d6f1e6b20c63 Mon Sep 17 00:00:00 2001 From: apriestman Date: Thu, 1 Jul 2021 11:44:49 -0400 Subject: [PATCH 21/33] Added section on Solr commit tuning --- .../solr/solr_comment_out_updateLog.jpg | Bin 0 -> 56168 bytes .../images/solr/solr_config_autocommit.jpg | Bin 0 -> 74238 bytes .../solr/solr_transaction_log_errors.jpg | Bin 0 -> 45602 bytes docs/doxygen-user/multi-user/installSolr.dox | 34 +++++++++++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 docs/doxygen-user/images/solr/solr_comment_out_updateLog.jpg create mode 100644 docs/doxygen-user/images/solr/solr_config_autocommit.jpg create mode 100644 docs/doxygen-user/images/solr/solr_transaction_log_errors.jpg diff --git a/docs/doxygen-user/images/solr/solr_comment_out_updateLog.jpg b/docs/doxygen-user/images/solr/solr_comment_out_updateLog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90737515fa749891782f560aaf854c302bf17704 GIT binary patch literal 56168 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%0Dkc`UBTv`r7z#OgD0 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 DLt^$5 literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/solr/solr_config_autocommit.jpg b/docs/doxygen-user/images/solr/solr_config_autocommit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e6cc7a9bf5b636094445f944f22b491f65d2d6f GIT binary patch literal 74238 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 ZX(Zpb2og5Gi2o#+{7pak&xh0(_E(l!wLSm< literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/solr/solr_transaction_log_errors.jpg b/docs/doxygen-user/images/solr/solr_transaction_log_errors.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4328068b57fd8019e484702a608e327ffc55f7c0 GIT binary patch literal 45602 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 literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/multi-user/installSolr.dox b/docs/doxygen-user/multi-user/installSolr.dox index d8a4690d58..dd380e6eef 100644 --- a/docs/doxygen-user/multi-user/installSolr.dox +++ b/docs/doxygen-user/multi-user/installSolr.dox @@ -207,7 +207,7 @@ Solr creates two types of data that need to be backed up:
  1. In a default installation that data is stored in \c "C:\solr-8.6.3\server\solr zoo_data" (assuming that the Solr package ZIP was extracted into \c "C:\solr-8.6.3" directory).
-\section Troubleshooting +\section troubleshooting Troubleshooting / Performance Tuning \subsection install_solr_delayed_start Delayed Start Problems With Large Number Of Solr Collections @@ -287,4 +287,36 @@ Some notes: +\subsection solr_commit_tuning Tuning Solr Server Commit Operations + +When Autopsy is running in a multi-user cluster environment with multiple auto ingest nodes, it may be beneficial to tune the configuration of Solr "commit" operations. + +Solr has two types of "commits" – hard commits and soft commits. These are explained in detail the following link: https://lucidworks.com/post/understanding-transaction-logs-softcommit-and-commit-in-sorlcloud/ + +In short: +
    +
  • Hard commits flush newly indexed documents from RAM to Solr index on disk. +
  • Depending on configuration, hard commits may or may not make the newly indexed documents "visible" to search. +
  • Soft commits do not flush newly indexed documents to disk but they make the newly indexed documents "visible" to search. +
+ +By default (when using AutopsyConfig) the Solr servers are performing a "hard" commit every 5 minutes and are also making the newly indexed documents "visible" to search. These operations can be costly when performed on a large index which is located on a shared network drive. In this stuation it can be very beneficial to modify Solr configuration (located in \c "SOLR_INSTALLATION_DIECTORY\server\solr\configsets\AutopsyConfig\conf\solrconfig.xml") with the following changes: +
    +
  1. Modify "hard commits" to still flush the newly created documents every 5 minutes but not make them "visible". This is accomplished by setting “openSearcher" to "false" in the "autoCommit" section of Solr configuration file. +
  2. Enable "soft commits" to be performed every 30 minutes thus making the newly indexed documents "visible" to search every 30 minutes. This is accomplished by enabling the "autoSoftCommit" section of Solr configuration file. The downside is that it may take up to 30 minutes to be able to search the latest document. Keep in mind that this only affects the scenario where an examiner is searching a case while the ingest is still ongoing. Autopsy automatically performs a commit after the ingest is complete so all the documents are immediately visible at that time. +
+ +The following image shows the Solr configuration changes discussed above: + +\image html solr_config_autocommit.jpg + +Until a hard commit is performed, by default Solr also maintains a transaction log which contains the raw text of every newly indexed document since last hard commit. When the Solr index is located on a network share, this again can be a very costly operation. Transaction logs can be disabled by commenting out the "updateLog" section of Solr configuration file: + +\image html solr_comment_out_updateLog.jpg + +Keep in mind that this has an unfortunate side effect of creating CommitTracker errors in Solr logs and Solr admin console. These errors can be ignored if transaction log has been intentionally disabled. + +\image html solr_transaction_log_errors.jpg + + */ From 9f76eb529244a1e626623f05958dfbad05d4a37b Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 2 Jul 2021 05:45:51 -0400 Subject: [PATCH 22/33] 7667 add back bundle property for Extract File --- .../sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED | 1 + .../sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED index e9f767cffe..e5e9f22a46 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED @@ -24,6 +24,7 @@ DateFilterPanel.invalidRange.text=Range or Only Last must be selected. DateFilterPanel.startAfterEnd.text=Start date should be before the end date when both are enabled. DateFilterPanel.startOrEndNeeded.text=A start or end date must be specified to use the range filter. DiscoveryDialog.name.text=Discovery +DiscoveryExtractAction.title.extractFiles.text=Extract File DiscoveryTopComponent.additionalFilters.text=; DiscoveryTopComponent.cancelButton.text=Cancel Search DiscoveryTopComponent.domainSearch.text=Type: Domain diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java index 7965878017..0818b3b22c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java @@ -40,8 +40,9 @@ final class DiscoveryExtractAction extends AbstractAction { * * @param selectedFiles The files to extract from the current case. */ + @NbBundle.Messages({"DiscoveryExtractAction.title.extractFiles.text=Extract File"}) DiscoveryExtractAction(Collection selectedFiles) { - super(NbBundle.getMessage(DiscoveryExtractAction.class, "DiscoveryExtractAction.title.extractFiles.text")); + super(Bundle.DiscoveryExtractAction_title_extractFiles_text()); files.addAll(selectedFiles); } From ea5b0d671c1107d9a1cb8a641805261712a5d445 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 2 Jul 2021 05:47:45 -0400 Subject: [PATCH 23/33] 7657 update copyright and autoformat --- .../sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java index 0818b3b22c..59ff07b86b 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DiscoveryExtractAction.java @@ -1,7 +1,7 @@ /* * Autopsy * - * Copyright 2019 Basis Technology Corp. + * Copyright 2019-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); From a7bb080a31b104cadbb77bad1b66d74ed411b55b Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 2 Jul 2021 12:57:57 -0400 Subject: [PATCH 24/33] displays no data in metadata viewer for istat on no data --- .../autopsy/contentviewers/Metadata.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Metadata.java b/Core/src/org/sleuthkit/autopsy/contentviewers/Metadata.java index 1bc0c5edd5..be7b093d0e 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Metadata.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Metadata.java @@ -129,9 +129,9 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { } private void addHeader(StringBuilder sb, String header, boolean spaced) { - sb.append(MessageFormat.format("

{2}

", + sb.append(MessageFormat.format("

{2}

", (spaced) ? ContentViewerHtmlStyles.getSpacedSectionClassName() : "", - ContentViewerHtmlStyles.getHeaderClassName(), + ContentViewerHtmlStyles.getHeaderClassName(), header)); } @@ -164,7 +164,7 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { private void addRowWithMultipleValues(StringBuilder sb, String key, String[] values) { String[] safeValues = values == null || values.length < 1 ? new String[]{""} : values; - + addRow(sb, key, safeValues[0]); Stream.of(safeValues) .skip(1) @@ -324,6 +324,7 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { this.node = node; } + @Messages("MetadataWorker.doInBackground.noDataMsg=No Data") @Override protected String doInBackground() throws Exception { AbstractFile file = node.getLookup().lookup(AbstractFile.class); @@ -397,7 +398,6 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { FsContent fsFile = (FsContent) file; addHeader(sb, NbBundle.getMessage(this.getClass(), "Metadata.nodeText.text"), true); - startTable(sb); List istatStrings = Collections.emptyList(); try { @@ -406,20 +406,29 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { istatStrings = Arrays.asList(NbBundle.getMessage(this.getClass(), "Metadata.nodeText.exceptionNotice.text") + ex.getLocalizedMessage()); } - for (String str : istatStrings) { - addMonospacedRow(sb, str); + if (istatStrings.isEmpty() || (istatStrings.size() == 1 && StringUtils.isEmpty(istatStrings.get(0)))) { + sb.append(MessageFormat.format("

{2}

", + ContentViewerHtmlStyles.getIndentedClassName(), + ContentViewerHtmlStyles.getTextClassName(), + Bundle.MetadataWorker_doInBackground_noDataMsg())); + } else { + startTable(sb); - /* + for (String str : istatStrings) { + addMonospacedRow(sb, str); + + /* * Very long results can cause the UI to hang before * displaying, so truncate the results if necessary. - */ - if (sb.length() > 50000) { - addMonospacedRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.nodeText.truncated")); - break; + */ + if (sb.length() > 50000) { + addMonospacedRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.nodeText.truncated")); + break; + } } - } - endTable(sb); + endTable(sb); + } } } else { @@ -461,11 +470,10 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer { // Add all the data source paths to the "Local Path" value cell. String[] imagePaths = image.getPaths(); - if (imagePaths.length > 0) { addRowWithMultipleValues(sb, - NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.localPath"), - imagePaths); + NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.localPath"), + imagePaths); } else { addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.localPath"), NbBundle.getMessage(this.getClass(), "Metadata.nodeText.none")); From 92cccf3dc19bf79289a86d34fcec00e12ddc7e16 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 2 Jul 2021 14:32:16 -0400 Subject: [PATCH 25/33] bundle file --- .../contentviewers/Bundle.properties-MERGED | 1339 +++++++++-------- 1 file changed, 701 insertions(+), 638 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 53aaacb575..d17c1766d6 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -70,6 +70,7 @@ MediaViewVideoPanel.progressLabel.text=00:00 MediaViewVideoPanel.infoLabel.text=info MediaViewImagePanel.imgFileTooLarge.msg=Could not load image file (too large): {0} +Metadata.headerTitle=Metadata Metadata.nodeText.loading=Metadata loading... Metadata.nodeText.none=None Metadata.nodeText.truncated=(results truncated) @@ -106,6 +107,7 @@ MessageArtifactViewer.textbodyScrollPane.TabConstraints.tabTitle=Text JPEGViewerDummy.jLabel1.text=You are looking at a JPEG file: JPEGViewerDummy.jTextField1.text=jTextField1 Metadata_dataArtifactTitle=Source File Metadata +MetadataWorker.doInBackground.noDataMsg=No Data PDFViewer.encryptedDialog=This document is password protected. PDFViewer.errorDialog=An error occurred while opening this PDF document. Check the logs for more information. You may continue to use this feature on other PDF documents. PListNode.KeyCol=Key @@ -181,776 +183,837 @@ TranslatablePanel.comboBoxOption.translatedText=Translated Text # {0} - exception message TranslatablePanel.onSetContentError.text=There was an error displaying the text: {0} ## Window toolbar Title -viewer.window.title.default=ICEpdf Viewer -viewer.window.title.open.default=ICEpdf Viewer - [{0}] +viewer.window.title.default = ICEpdf Viewer +viewer.window.title.open.default = ICEpdf Viewer - [{0}] #status bar -viewer.statusbar.currentPage=Page {0} / {1} +viewer.statusbar.currentPage = Page {0} / {1} -viewer.common.number.one=1 -viewer.common.number.two=2 -viewer.common.number.three=3 -viewer.common.number.four=4 -viewer.common.number.five=5 -viewer.common.number.six=6 -viewer.common.number.seven=7 -viewer.common.number.eight=8 -viewer.common.number.nine=9 -viewer.common.number.ten=10 -viewer.common.number.eleven=11 -viewer.common.number.twelve=12 -viewer.common.number.thirteen=13 -viewer.common.number.fourteen=14 -viewer.common.number.fifteen=15 -viewer.common.number.sixteen=16 -viewer.common.number.seventeen=17 -viewer.common.number.eighteen=18 -viewer.common.number.nineteen=19 -viewer.common.number.twenty=20 -viewer.common.number.twentyOne=21 -viewer.common.number.twentyTwo=22 -viewer.common.number.twentyThree=23 -viewer.common.number.twentyFour=24 -viewer.common.number.twentyFive=25 -viewer.common.number.twentySix=26 -viewer.common.number.twentySeven=27 -viewer.common.number.thirtySix=36 -viewer.common.number.fortyEight=48 +viewer.common.number.one = 1 +viewer.common.number.two = 2 +viewer.common.number.three = 3 +viewer.common.number.four = 4 +viewer.common.number.five = 5 +viewer.common.number.six = 6 +viewer.common.number.seven = 7 +viewer.common.number.eight = 8 +viewer.common.number.nine = 9 +viewer.common.number.ten = 10 +viewer.common.number.eleven = 11 +viewer.common.number.twelve = 12 +viewer.common.number.thirteen = 13 +viewer.common.number.fourteen = 14 +viewer.common.number.fifteen = 15 +viewer.common.number.sixteen = 16 +viewer.common.number.seventeen = 17 +viewer.common.number.eighteen = 18 +viewer.common.number.nineteen = 19 +viewer.common.number.twenty = 20 +viewer.common.number.twentyOne = 21 +viewer.common.number.twentyTwo = 22 +viewer.common.number.twentyThree = 23 +viewer.common.number.twentyFour = 24 +viewer.common.number.twentyFive = 25 +viewer.common.number.twentySix = 26 +viewer.common.number.twentySeven = 27 +viewer.common.number.thirtySix = 36 +viewer.common.number.fortyEight = 48 ## Top Page Control Toolbar -viewer.toolbar.hideToolBar.label=Hide Toolbar -viewer.toolbar.showToolBar.label=Show Toolbar -viewer.toolbar.showUtilityPane.label=Show Utility Pane -viewer.toolbar.hideUtilityPane.label=Hide Utility Pane -viewer.toolbar.open.label= -viewer.toolbar.open.tooltip=Open Document -viewer.toolbar.saveAs.label=Save As -viewer.toolbar.saveAs.tooltip=Save As... -viewer.toolbar.print.label=Print -viewer.toolbar.print.tooltip=Print Document -viewer.toolbar.search.label=Search -viewer.toolbar.search.tooltip=Search Document -viewer.toolbar.utilityPane.label=Utility Pane -viewer.toolbar.utilityPane.tooltip=Show/Hide Utility Pane -viewer.toolbar.navigation.label= -viewer.toolbar.navigation.pages.tooltip=Number of Pages -viewer.toolbar.navigation.pages.firstPage.label= -viewer.toolbar.navigation.current.tooltip=Current Page Number -viewer.toolbar.navigation.current.firstPage.label= -viewer.toolbar.navigation.firstPage.label= -viewer.toolbar.navigation.firstPage.tooltip=First Page -viewer.toolbar.navigation.previousPage.label= -viewer.toolbar.navigation.previousPage.tooltip=Previous Page -viewer.toolbar.navigation.nextPage.label= -viewer.toolbar.navigation.nextPage.tooltip=Next Page -viewer.toolbar.navigation.lastPage.label= -viewer.toolbar.navigation.lastPage.tooltip=Last Page -viewer.toolbar.pageIndicator=of {0} -viewer.toolbar.zoom.label= -viewer.toolbar.zoom.tooltip=Zoom -viewer.toolbar.zoom.out.label= -viewer.toolbar.zoom.out.tooltip=Zoom Out -viewer.toolbar.zoom.in.label= -viewer.toolbar.zoom.in.tooltip=Zoom In -viewer.toolbar.pageFit.actualsize.label= -viewer.toolbar.pageFit.actualsize.tooltip=Actual Size -viewer.toolbar.pageFit.fitWindow.label= -viewer.toolbar.pageFit.fitWindow.tooltip=Fit in Window -viewer.toolbar.pageFit.fitWidth.label= -viewer.toolbar.pageFit.fitWidth.tooltip=Fit Width -viewer.toolbar.rotation.left.label= -viewer.toolbar.rotation.left.tooltip=Rotate Left -viewer.toolbar.rotation.right.label= -viewer.toolbar.rotation.right.tooltip=Rotate Right -viewer.toolbar.tool.pan.label= -viewer.toolbar.tool.pan.tooltip=Pan Tool -viewer.toolbar.tool.text.label= -viewer.toolbar.tool.text.tooltip=Text Select Tool -viewer.toolbar.tool.select.label= -viewer.toolbar.tool.select.tooltip=Select Tool -viewer.toolbar.tool.link.label= -viewer.toolbar.tool.link.tooltip=Link Annotation Tool -viewer.toolbar.tool.highlight.label=Highlight -viewer.toolbar.tool.highlight.tooltip=Highlight Annotation Tool -viewer.toolbar.tool.strikeOut.label=Strike Out -viewer.toolbar.tool.strikeOut.tooltip=Strike Out Annotation Tool -viewer.toolbar.tool.underline.label=Underline -viewer.toolbar.tool.underline.tooltip=Underline Annotation Tool -viewer.toolbar.tool.line.label=Line -viewer.toolbar.tool.line.tooltip=Line Annotation Tool -viewer.toolbar.tool.lineArrow.label=Line Arrow -viewer.toolbar.tool.lineArrow.tooltip=Line Arrow Annotation Tool -viewer.toolbar.tool.rectangle.label=Rectangle -viewer.toolbar.tool.rectangle.tooltip=Rectangle Annotation Tool -viewer.toolbar.tool.circle.label=Circle -viewer.toolbar.tool.circle.tooltip=Circle Annotation Tool -viewer.toolbar.tool.ink.label=Ink -viewer.toolbar.tool.ink.tooltip=Ink Annotation Tool -viewer.toolbar.tool.freeText.label=Free Text -viewer.toolbar.tool.freeText.tooltip=Free Text Annotation Tool -viewer.toolbar.tool.textAnno.label=Text Annotation -viewer.toolbar.tool.textAnno.tooltip=Text Annotation Tool -viewer.toolbar.tool.plolyLine.label=Poly Line -viewer.toolbar.tool.plolyLine.tooltip=Poly Line Annotation Tool -viewer.toolbar.tool.zoomIn.label= -viewer.toolbar.tool.zoomIn.tooltip=Zoom In Tool -viewer.toolbar.tool.zoomMarquis.label= -viewer.toolbar.tool.zoomMarquis.tooltip=Zoom Marquee Tool -viewer.toolbar.tool.zoomDynamic.label= -viewer.toolbar.tool.zoomDynamic.tooltip=Zoom Dynamic Tool -viewer.toolbar.tool.zoomOut.label= -viewer.toolbar.tool.zoomOut.tooltip=Zoom Out Tool -viewer.toolbar.pageFit.fontEngine.label= -viewer.toolbar.pageFit.fontEngine.tooltip=Enable/Disable Font Engine -viewer.toolbar.tool.forms.highlight.label=Highlight Forms -viewer.toolbar.tool.forms.highlight.tooltip=Show/Hide Form Highlighting +viewer.toolbar.hideToolBar.label = Hide Toolbar +viewer.toolbar.showToolBar.label = Show Toolbar +viewer.toolbar.showUtilityPane.label = Show Utility Pane +viewer.toolbar.hideUtilityPane.label = Hide Utility Pane +viewer.toolbar.open.label = +viewer.toolbar.open.tooltip = Open Document +viewer.toolbar.saveAs.label = Save As +viewer.toolbar.saveAs.tooltip = Save As... +viewer.toolbar.print.label = Print +viewer.toolbar.print.tooltip = Print Document +viewer.toolbar.search.label = Search +viewer.toolbar.search.tooltip = Search Document +viewer.toolbar.utilityPane.label = Utility Pane +viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane +viewer.toolbar.navigation.label = +viewer.toolbar.navigation.pages.tooltip = Number of Pages +viewer.toolbar.navigation.pages.firstPage.label = +viewer.toolbar.navigation.current.tooltip = Current Page Number +viewer.toolbar.navigation.current.firstPage.label = +viewer.toolbar.navigation.firstPage.label = +viewer.toolbar.navigation.firstPage.tooltip = First Page +viewer.toolbar.navigation.previousPage.label = +viewer.toolbar.navigation.previousPage.tooltip = Previous Page +viewer.toolbar.navigation.nextPage.label = +viewer.toolbar.navigation.nextPage.tooltip = Next Page +viewer.toolbar.navigation.lastPage.label = +viewer.toolbar.navigation.lastPage.tooltip = Last Page +viewer.toolbar.pageIndicator = of {0} +viewer.toolbar.zoom.label = +viewer.toolbar.zoom.tooltip = Zoom +viewer.toolbar.zoom.out.label = +viewer.toolbar.zoom.out.tooltip = Zoom Out +viewer.toolbar.zoom.in.label = +viewer.toolbar.zoom.in.tooltip = Zoom In +viewer.toolbar.pageFit.actualsize.label = +viewer.toolbar.pageFit.actualsize.tooltip = Actual Size +viewer.toolbar.pageFit.fitWindow.label = +viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window +viewer.toolbar.pageFit.fitWidth.label = +viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width +viewer.toolbar.rotation.left.label = +viewer.toolbar.rotation.left.tooltip = Rotate Left +viewer.toolbar.rotation.right.label = +viewer.toolbar.rotation.right.tooltip = Rotate Right +viewer.toolbar.tool.pan.label = +viewer.toolbar.tool.pan.tooltip = Pan Tool +viewer.toolbar.tool.text.label = +viewer.toolbar.tool.text.tooltip = Text Select Tool +viewer.toolbar.tool.select.label = +viewer.toolbar.tool.select.tooltip = Select Tool +viewer.toolbar.tool.link.label = +viewer.toolbar.tool.link.tooltip = Link Annotation Tool +viewer.toolbar.tool.highlight.label = Highlight +viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool +viewer.toolbar.tool.strikeOut.label = Strike Out +viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool +viewer.toolbar.tool.underline.label = Underline +viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool +viewer.toolbar.tool.line.label = Line +viewer.toolbar.tool.line.tooltip = Line Annotation Tool +viewer.toolbar.tool.lineArrow.label = Line Arrow +viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool +viewer.toolbar.tool.rectangle.label = Rectangle +viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool +viewer.toolbar.tool.circle.label = Circle +viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool +viewer.toolbar.tool.ink.label = Ink +viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool +viewer.toolbar.tool.freeText.label = Free Text +viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool +viewer.toolbar.tool.textAnno.label = Text Annotation +viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool +viewer.toolbar.tool.plolyLine.label = Poly Line +viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool +viewer.toolbar.tool.zoomIn.label = +viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool +viewer.toolbar.tool.zoomMarquis.label = +viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool +viewer.toolbar.tool.zoomDynamic.label = +viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool +viewer.toolbar.tool.zoomOut.label = +viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool +viewer.toolbar.pageFit.fontEngine.label = +viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine +viewer.toolbar.tool.forms.highlight.label = Highlight Forms +viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting ## Bottom Page View Control Toolbar -viewer.toolbar.pageView.nonContinuous.singlePage.label= -viewer.toolbar.pageView.nonContinuous.singlePage.tooltip=Single Page View Non-Continuous -viewer.toolbar.pageView.nonContinuous.facingPage.label= -viewer.toolbar.pageView.nonContinuous.facingPage.tooltip=Facing Page View Non-Continuous -viewer.toolbar.pageView.continuous.singlePage.label= -viewer.toolbar.pageView.continuous.singlePage.tooltip=Single Page View Continuous -viewer.toolbar.pageView.continuous.facingPage.label= -viewer.toolbar.pageView.continuous.facingPage.tooltip=Facing Page View Continuous +viewer.toolbar.pageView.nonContinuous.singlePage.label = +viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous +viewer.toolbar.pageView.nonContinuous.facingPage.label = +viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous +viewer.toolbar.pageView.continuous.singlePage.label = +viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous +viewer.toolbar.pageView.continuous.facingPage.label = +viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous ## File Menu and submenu items -viewer.menu.file.label=File -viewer.menu.file.mnemonic=F -viewer.menu.open.label=Open -viewer.menu.open.file.label=File... -viewer.menu.open.URL.label=URL... -viewer.menu.close.label=Close -viewer.menu.saveAs.label=Save As... -viewer.menu.exportText.label=Export Text... -viewer.menu.exportSVG.label=Export SVG... -viewer.menu.documentPermission.label=Document Permissions... -viewer.menu.documentInformation.label=Document Information... -viewer.menu.documentFonts.label=Document Fonts... -viewer.menu.printSetup.label=Print Setup... -viewer.menu.print.label=Print... -viewer.menu.exit.label=Exit +viewer.menu.file.label = File +viewer.menu.file.mnemonic = F +viewer.menu.open.label = Open +viewer.menu.open.file.label = File... +viewer.menu.open.URL.label = URL... +viewer.menu.close.label = Close +viewer.menu.saveAs.label = Save As... +viewer.menu.exportText.label = Export Text... +viewer.menu.exportSVG.label = Export SVG... +viewer.menu.documentPermission.label = Document Permissions... +viewer.menu.documentInformation.label = Document Information... +viewer.menu.documentFonts.label = Document Fonts... +viewer.menu.printSetup.label = Print Setup... +viewer.menu.print.label = Print... +viewer.menu.exit.label = Exit ## View Menu and submenu items -viewer.menu.edit.label=Edit -viewer.menu.edit.mnemonic=E -viewer.menu.edit.undo.label=Undo -viewer.menu.edit.redo.label=Redo -viewer.menu.edit.copy.label=Copy -viewer.menu.edit.delete.label=Delete -viewer.menu.edit.selectAll.label=Select All -viewer.menu.edit.deselectAll.label=Deselect All +viewer.menu.edit.label = Edit +viewer.menu.edit.mnemonic = E +viewer.menu.edit.undo.label = Undo +viewer.menu.edit.redo.label = Redo +viewer.menu.edit.copy.label = Copy +viewer.menu.edit.delete.label = Delete +viewer.menu.edit.selectAll.label = Select All +viewer.menu.edit.deselectAll.label = Deselect All ## View Menu and submenu items -viewer.menu.view.label=View -viewer.menu.view.mnemonic=V -viewer.menu.view.actualSize.label=Actual Size -viewer.menu.view.fitInWindow.label=Fit in Window -viewer.menu.view.fitWidth.label=Fit Width -viewer.menu.view.zoomIn.label=Zoom In -viewer.menu.view.zoomOut.label=Zoom Out -viewer.menu.view.rotateLeft.label=Rotate Left -viewer.menu.view.rotateRight.label=Rotate Right -viewer.menu.view.hideToolBar.label=Hide Toolbar -viewer.menu.view.showToolBar.label=Show Toolbar -viewer.menu.view.showUtilityPane.label=Show Utility Pane -viewer.menu.view.hideUtilityPane.label=Hide Utility Pane +viewer.menu.view.label = View +viewer.menu.view.mnemonic = V +viewer.menu.view.actualSize.label = Actual Size +viewer.menu.view.fitInWindow.label = Fit in Window +viewer.menu.view.fitWidth.label = Fit Width +viewer.menu.view.zoomIn.label = Zoom In +viewer.menu.view.zoomOut.label = Zoom Out +viewer.menu.view.rotateLeft.label = Rotate Left +viewer.menu.view.rotateRight.label = Rotate Right +viewer.menu.view.hideToolBar.label = Hide Toolbar +viewer.menu.view.showToolBar.label = Show Toolbar +viewer.menu.view.showUtilityPane.label = Show Utility Pane +viewer.menu.view.hideUtilityPane.label = Hide Utility Pane ## Document Menu and submenu items -viewer.menu.document.label=Document -viewer.menu.document.mnemonic=D -viewer.menu.document.firstPage.label=First Page -viewer.menu.document.previousPage.label=Previous Page -viewer.menu.document.nextPage.label=Next Page -viewer.menu.document.lastPage.label=Last Page -viewer.menu.document.search.label=Search... -viewer.menu.document.gotToPage.label=Go To Page... +viewer.menu.document.label = Document +viewer.menu.document.mnemonic = D +viewer.menu.document.firstPage.label = First Page +viewer.menu.document.previousPage.label = Previous Page +viewer.menu.document.nextPage.label = Next Page +viewer.menu.document.lastPage.label = Last Page +viewer.menu.document.search.label = Search... +viewer.menu.document.gotToPage.label = Go To Page... ## Window Menu and submenu items -viewer.menu.window.label=Window -viewer.menu.window.mnemonic=W -viewer.menu.window.minAll.label=Minimize All -viewer.menu.window.minAll.mnemonic=M -viewer.menu.window.frontAll.label=Bring All to Front -viewer.menu.window.frontAll.mnemonic=B -viewer.menu.window.1.label=1 -viewer.menu.window.1.mnemonic=1 -viewer.menu.window.2.label=2 -viewer.menu.window.2.mnemonic=2 -viewer.menu.window.3.label=3 -viewer.menu.window.3.mnemonic=3 -viewer.menu.window.4.label=4 -viewer.menu.window.4.mnemonic=4 -viewer.menu.window.5.label=5 -viewer.menu.window.5.mnemonic=5 -viewer.menu.window.6.label=6 -viewer.menu.window.6.mnemonic=6 -viewer.menu.window.7.label=7 -viewer.menu.window.7.mnemonic=7 -viewer.menu.window.8.label=8 -viewer.menu.window.8.mnemonic=8 -viewer.menu.window.9.label=9 -viewer.menu.window.9.mnemonic=9 +viewer.menu.window.label = Window +viewer.menu.window.mnemonic = W +viewer.menu.window.minAll.label = Minimize All +viewer.menu.window.minAll.mnemonic = M +viewer.menu.window.frontAll.label = Bring All to Front +viewer.menu.window.frontAll.mnemonic = B +viewer.menu.window.1.label = 1 +viewer.menu.window.1.mnemonic = 1 +viewer.menu.window.2.label = 2 +viewer.menu.window.2.mnemonic = 2 +viewer.menu.window.3.label = 3 +viewer.menu.window.3.mnemonic = 3 +viewer.menu.window.4.label = 4 +viewer.menu.window.4.mnemonic = 4 +viewer.menu.window.5.label = 5 +viewer.menu.window.5.mnemonic = 5 +viewer.menu.window.6.label = 6 +viewer.menu.window.6.mnemonic = 6 +viewer.menu.window.7.label = 7 +viewer.menu.window.7.mnemonic = 7 +viewer.menu.window.8.label = 8 +viewer.menu.window.8.mnemonic = 8 +viewer.menu.window.9.label = 9 +viewer.menu.window.9.mnemonic = 9 ## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic ## where X is an incrementing integer. The mnemonic should be one unique ## character found within the label ## Help Menu and submenu items -viewer.menu.help.label=Help -viewer.menu.help.mnemonic=H -viewer.menu.help.about.label=About ICEpdf viewer... +viewer.menu.help.label = Help +viewer.menu.help.mnemonic = H +viewer.menu.help.about.label = About ICEpdf viewer... ## General error dialog -viewer.dialog.error.exception.title=ICEsoft ICEpdf - Exception -viewer.dialog.error.exception.msg=There was an error executing your command do to the following exception\n{0}. +viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.error.exception.msg = \ + There was an error executing your command do to the following exception\n\ + {0}. ## Open File Dialog -viewer.dialog.openFile.title=Open File -viewer.dialog.openFile.error.title=ICEsoft ICEpdf - Open File Error -viewer.dialog.openFile.error.msg=ICEpdf could not open the specified file at {0}\nThe file may be corrupt or not a supported file type. +viewer.dialog.openFile.title = Open File +viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error +viewer.dialog.openFile.error.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openDocument.pdfException.title=ICEsoft ICEpdf - PDF Exception -viewer.dialog.openDocument.pdfException.msg=ICEpdf could not open the specified file {0} \nThe file may be corrupt or not a supported file type. +viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception +viewer.dialog.openDocument.pdfException.msg = \ + ICEpdf could not open the specified file {0} \n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openDocument.pdfSecurityException.title=ICEsoft ICEpdf - PDF Security Exception -viewer.dialog.openDocument.pdfSecurityException.msg=ICEpdf could not open the encrypted file at {0}\nThis may be the result of an invalid password or a missing JCE Security Provider.\n\nPlease refer to ICEpdf Developer's Guide for more information. +viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception +viewer.dialog.openDocument.pdfSecurityException.msg = \ + ICEpdf could not open the encrypted file at {0}\n\ + This may be the result of an invalid password or a missing JCE Security Provider.\n\n\ + Please refer to ICEpdf Developer's Guide for more information. -viewer.dialog.openDocument.exception.title=ICEsoft ICEpdf - Exception -viewer.dialog.openDocument.exception.msg=ICEpdf could not open the specified file at {0}\nThe file may be corrupt or not a supported file type. +viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.openDocument.exception.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openURL.exception.title=ICEsoft ICEpdf - URL Exception -viewer.dialog.openURL.exception.msg=ICEpdf could not open the specified file. {0} \nat URL: {1} -viewer.dialog.openURL.downloading.msg=Downloading {0} +viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception +viewer.dialog.openURL.exception.msg = \ + ICEpdf could not open the specified file. {0} \n\ + at URL: {1} +viewer.dialog.openURL.downloading.msg = Downloading {0} ## General error dialog -viewer.dialog.information.copyAll.title=ICEsoft ICEpdf - Information -viewer.dialog.information.copyAll.msg=The document has more than {0} pages, please use\n"Export text..." to extract document text. +viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information +viewer.dialog.information.copyAll.msg = \ + The document has more than {0} pages, please use\n\ + "Export text..." to extract document text. ## Open URL Dialog -viewer.dialog.security.title=Document Security -viewer.dialog.security.msg=This PDF is protected -viewer.dialog.security.password.label=Password: -viewer.dialog.security.okButton.label=Ok -viewer.dialog.security.okButton.mnemonic=O -viewer.dialog.security.cancelButton.label=Cancel -viewer.dialog.security.cancelButton.mnemonic=C +viewer.dialog.security.title = Document Security +viewer.dialog.security.msg = This PDF is protected +viewer.dialog.security.password.label = Password: +viewer.dialog.security.okButton.label = Ok +viewer.dialog.security.okButton.mnemonic = O +viewer.dialog.security.cancelButton.label = Cancel +viewer.dialog.security.cancelButton.mnemonic = C ## Open URL Dialog -viewer.dialog.openURL.title=Open URL +viewer.dialog.openURL.title = Open URL ### Save a Copy Dialog -viewer.dialog.saveAs.title=Save As -viewer.dialog.saveAs.extensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.extensionError.msg=ICEpdf could not save to {0} because it is not a supported file type. -viewer.dialog.saveAs.noExtensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.noExtensionError.msg=Please specify a file extension. -viewer.dialog.saveAs.noneUniqueName.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.noneUniqueName.msg=The file named {0} already exists. Please specify a unique name. -viewer.dialog.saveAs.noPermission.title=ICEpdf Viewer RI - Save Error -viewer.dialog.saveAs.noPermission.msg=You do not have permission or the credentials to save this document. -viewer.dialog.saveAs.noUpdates.title=ICEpdf Viewer RI -viewer.dialog.saveAs.noUpdates.msg=Document changes will not be saved, please upgrade to ICEpdf PRO. -viewer.dialog.saveOnClose.noUpdates.title=ICEpdf Viewer RI -viewer.dialog.saveOnClose.noUpdates.msg=Do you want to save changes to {0}? +viewer.dialog.saveAs.title = Save As +viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.extensionError.msg = \ + ICEpdf could not save to {0} because it is not a supported file type. +viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension. +viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.noneUniqueName.msg = \ + The file named {0} already exists. Please specify a unique name. +viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error +viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document. +viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI +viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO. +viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI +viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}? ## Export Text Dialog -viewer.dialog.exportText.title=Export Document Text -viewer.dialog.exportText.progress.msg=Extracting PDF Text -viewer.dialog.exportText.noExtensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.exportText.noExtensionError.msg=Please specify a file extension. +viewer.dialog.exportText.title = Export Document Text +viewer.dialog.exportText.progress.msg = Extracting PDF Text +viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension. # Text extraction output file -viewer.exportText.fileStamp.msg=ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc. -viewer.exportText.pageStamp.msg= +viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc. +viewer.exportText.pageStamp.msg = # Completed x out of y page(s). -viewer.exportText.fileStamp.progress.msg=Completed {0} out of {1}. -viewer.exportText.fileStamp.progress.oneFile.msg={2} page -viewer.exportText.fileStamp.progress.moreFile.msg={2} pages +viewer.exportText.fileStamp.progress.msg = \ + Completed {0} out of {1}. +viewer.exportText.fileStamp.progress.oneFile.msg = {2} page +viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages ## Export SVG Dialog -viewer.dialog.exportSVG.title=Export to SVG -viewer.dialog.exportSVG.status.exporting.msg=Exporting page {0} to SVG file {1} ... -viewer.dialog.exportSVG.status.error.msg=Problem exporting page {0} to SVG file {1} : {2} -viewer.dialog.exportSVG.status.finished.msg=Finished exporting page {0} to SVG file {1} -viewer.dialog.exportSVG.noExtensionError.title=ICEsoft ICEpdf - SVG Error -viewer.dialog.exportSVG.noExtensionError.msg=Please specify a file extension. -viewer.dialog.exportSVG.exportError.title=ICEsoft ICEpdf - SVG Error -viewer.dialog.exportSVG.exportError.msg=ICEpdf could not export to {0} \nbecuase it is either not a supported file type or \nbecause the file has been corrupted. +viewer.dialog.exportSVG.title = Export to SVG +viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ... +viewer.dialog.exportSVG.status.error.msg = \ + Problem exporting page {0} to SVG file {1} : {2} +viewer.dialog.exportSVG.status.finished.msg = \ + Finished exporting page {0} to SVG file {1} +viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error +viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension. +viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error +viewer.dialog.exportSVG.exportError.msg = \ + ICEpdf could not export to {0} \n\ + becuase it is either not a supported file type or \n\ + because the file has been corrupted. # Printing Progress bar -viewer.dialog.printing.status.progress.msg=Page {0} of {1} -viewer.dialog.printing.status.start.msg=Spooling Page(s) to Printer +viewer.dialog.printing.status.progress.msg = Page {0} of {1} +viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer ## Document Permissions Dialog -viewer.dialog.documentPermissions.title=Document Permissions -viewer.dialog.documentPermissions.securityMethod.label=Security Method: -viewer.dialog.documentPermissions.userPassword.label=User Password: -viewer.dialog.documentPermissions.ownerPassword.label=Owner Password: -viewer.dialog.documentPermissions.printing.label=Printing: -viewer.dialog.documentPermissions.changing.label=Changing the Document: -viewer.dialog.documentPermissions.copyExtraction.label=Content Copying or Extraction: -viewer.dialog.documentPermissions.comments.label=Aurthoring Comments and Form Fields: -viewer.dialog.documentPermissions.formFillingIn.label=Form Field Fill-in or Signing: -viewer.dialog.documentPermissions.accessibility.label=Content Accessibility Enabled: -viewer.dialog.documentPermissions.assembly.label=Document Assembly: -viewer.dialog.documentPermissions.encryptionLevel.label=Encryption Level: -viewer.dialog.documentPermissions.securityLevel={0}-bit v{1} R {2} -viewer.dialog.documentPermissions.none=None -viewer.dialog.documentPermissions.no=No -viewer.dialog.documentPermissions.yes=Yes -viewer.dialog.documentPermissions.allowed=Allowed -viewer.dialog.documentPermissions.notAllowed=Not Allowed -viewer.dialog.documentPermissions.fullyAllowed=Fully Allowed -viewer.dialog.documentPermissions.standardSecurity=Adobe Acrobat Standard Security -viewer.dialog.documentPermissions.partial=Partial (Low Quality) +viewer.dialog.documentPermissions.title = Document Permissions +viewer.dialog.documentPermissions.securityMethod.label = Security Method: +viewer.dialog.documentPermissions.userPassword.label = User Password: +viewer.dialog.documentPermissions.ownerPassword.label = Owner Password: +viewer.dialog.documentPermissions.printing.label = Printing: +viewer.dialog.documentPermissions.changing.label = Changing the Document: +viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction: +viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields: +viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing: +viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled: +viewer.dialog.documentPermissions.assembly.label = Document Assembly: +viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level: +viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2} +viewer.dialog.documentPermissions.none = None +viewer.dialog.documentPermissions.no = No +viewer.dialog.documentPermissions.yes = Yes +viewer.dialog.documentPermissions.allowed = Allowed +viewer.dialog.documentPermissions.notAllowed = Not Allowed +viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed +viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security +viewer.dialog.documentPermissions.partial = Partial (Low Quality) ## Document Information Dialog -viewer.dialog.documentInformation.title=Document Information -viewer.dialog.documentInformation.title.label=Title: -viewer.dialog.documentInformation.subject.label=Subject: -viewer.dialog.documentInformation.author.label=Author: -viewer.dialog.documentInformation.keywords.label=Keywords: -viewer.dialog.documentInformation.creator.label=Creator: -viewer.dialog.documentInformation.producer.label=Producer: -viewer.dialog.documentInformation.created.label=Created: -viewer.dialog.documentInformation.modified.label=Modified: -viewer.dialog.documentInformation.notAvailable=Not Available +viewer.dialog.documentInformation.title = Document Information +viewer.dialog.documentInformation.title.label = Title: +viewer.dialog.documentInformation.subject.label = Subject: +viewer.dialog.documentInformation.author.label = Author: +viewer.dialog.documentInformation.keywords.label = Keywords: +viewer.dialog.documentInformation.creator.label = Creator: +viewer.dialog.documentInformation.producer.label = Producer: +viewer.dialog.documentInformation.created.label = Created: +viewer.dialog.documentInformation.modified.label = Modified: +viewer.dialog.documentInformation.notAvailable = Not Available ## Go to Page Dialog -viewer.dialog.goToPage.title=Go to Page... -viewer.dialog.goToPage.description.label=Page Number +viewer.dialog.goToPage.title = Go to Page... +viewer.dialog.goToPage.description.label = Page Number ## About Dialog -viewer.dialog.about.title=About ICEpdf Viewer -viewer.dialog.about.pageNumber.label=\n\nCheck the ICEpdf web site for the latest news:\nhttp://www.icepdf.org/ \n\n +viewer.dialog.about.title = About ICEpdf Viewer +viewer.dialog.about.pageNumber.label = \n\ +\n\ +Check the ICEpdf web site for the latest news:\n\ +http://www.icepdf.org/ \n\n ## Font Properties Dialog -viewer.dialog.fonts.title=Document Font Properties -viewer.dialog.fonts.border.label=Fonts used by this document -viewer.dialog.fonts.info.type.label=Type: {0} -viewer.dialog.fonts.info.encoding.label=Encoding: {0} -viewer.dialog.fonts.info.substitution.type.label=Actual Type: {0} -viewer.dialog.fonts.info.substitution.path.label=Path: {0} -viewer.dialog.fonts.searching.label=Collecting font data ({0}%). -viewer.dialog.fonts.resetCache.label=Reset Cache -viewer.dialog.fonts.resetCache.tip=Reset font properties cache file and rescan system for new fonts. +viewer.dialog.fonts.title = Document Font Properties +viewer.dialog.fonts.border.label = Fonts used by this document +viewer.dialog.fonts.info.type.label = Type: {0} +viewer.dialog.fonts.info.encoding.label = Encoding: {0} +viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0} +viewer.dialog.fonts.info.substitution.path.label = Path: {0} +viewer.dialog.fonts.searching.label = Collecting font data ({0}%). +viewer.dialog.fonts.resetCache.label = Reset Cache +viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts. ## Utility Pane Bookmarks Tab -viewer.utilityPane.bookmarks.tab.title=Bookmarks +viewer.utilityPane.bookmarks.tab.title = Bookmarks ## Utility Pane Bookmarks Tab -viewer.utilityPane.attachments.tab.title=Attachments -viewer.utilityPane.attachments.column.fileName.title=Name -viewer.utilityPane.attachments.column.description.title=Description -viewer.utilityPane.attachments.column.modified.title=Modified -viewer.utilityPane.attachments.column.size.title=Size -viewer.utilityPane.attachments.column.compressedSize.title=Compressed size -viewer.utilityPane.attachments.menu.saveAs.label=Save As... -viewer.utilityPane.attachments.saveAs.replace.title=ICEsoft ICEpdf - Save Error -viewer.utilityPane.attachments.saveAs.replace.msg=The file named {0} already exists. Do you want to replace It? +viewer.utilityPane.attachments.tab.title = Attachments +viewer.utilityPane.attachments.column.fileName.title = Name +viewer.utilityPane.attachments.column.description.title = Description +viewer.utilityPane.attachments.column.modified.title = Modified +viewer.utilityPane.attachments.column.size.title = Size +viewer.utilityPane.attachments.column.compressedSize.title = Compressed size +viewer.utilityPane.attachments.menu.saveAs.label = Save As... +viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error +viewer.utilityPane.attachments.saveAs.replace.msg = \ + The file named {0} already exists. Do you want to replace It? ## Utility Pane Thumbnails -viewer.utilityPane.thumbs.tab.title=Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails ## Layers Pane -viewer.utilityPane.layers.tab.title=Layers +viewer.utilityPane.layers.tab.title = Layers ## Signature Pane -viewer.utilityPane.signatures.tab.title=Signatures -viewer.utilityPane.signatures.tab.certTree.error.label=Unsigned Signature Fields Signer certificate could not be validated {0} {1} -viewer.utilityPane.signatures.tab.certTree.rootSigned.label=Signed by {0} {1} -viewer.utilityPane.signatures.tab.certTree.rootValidating.label=Validating signature {0} {1} -viewer.utilityPane.signatures.tab.certTree.cert.invalid.label=Signature is invalid: -viewer.utilityPane.signatures.tab.certTree.cert.unknown.label=Signature is valid: -viewer.utilityPane.signatures.tab.certTree.cert.valid.label=Signature validity is unknown: -viewer.utilityPane.signatures.tab.certTree.doc.modified.label=This version of the document is unaltered but subsequent changes have been made -viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label=Document has not been modified since it was signed -viewer.utilityPane.signatures.tab.certTree.doc.major.label=Document has been altered or corrupted since it was signed -viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label=Signer's identity is unknown because it could not be found in your keystore -viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label=Signature is valid, but revocation of the signer's identity could not be checked -viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label=Signer's identity is valid -viewer.utilityPane.signatures.tab.certTree.signature.time.local.label=Signing time is from the clock on this signer's computer -viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label=Signature included an embedded timestamp but it could not be validated -viewer.utilityPane.signatures.tab.certTree.signature.details.label=Signature Details -viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label=Reason: {0} -viewer.utilityPane.signatures.tab.certTree.signature.details.location.label=Location: {0} -viewer.utilityPane.signatures.tab.certTree.signature.details.full.label=Certificate Details... -viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label=Last Checked: {0} -viewer.utilityPane.signatures.tab.certTree.unsigned.label=Unsigned Signature Fields +viewer.utilityPane.signatures.tab.title = Signatures +viewer.utilityPane.signatures.tab.certTree.error.label = \ + Unsigned Signature Fields Signer certificate could not be validated {0} {1} +viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1} +viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1} +viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid: +viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid: +viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown: +viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \ + This version of the document is unaltered but subsequent changes have been made +viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed +viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed +viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \ + Signer's identity is unknown because it could not be found in your keystore +viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \ + Signature is valid, but revocation of the signer's identity could not be checked +viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid +viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer +viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \ + Signature included an embedded timestamp but it could not be validated +viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details +viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0} +viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0} +viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details... +viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0} +viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields ## Signature certificate view dialog. -viewer.utilityPane.signatures.cert.dialog.title=Certificate Details -viewer.utilityPane.signatures.cert.dialog.closeButton.label=Close -viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic=C -viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label=N/A -viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label=N/A Subject -viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label=N/A Issuer -viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label={0} - {1} -viewer.utilityPane.signatures.cert.dialog.info.column1.label=Field -viewer.utilityPane.signatures.cert.dialog.info.column2.label=Value -viewer.utilityPane.signatures.cert.dialog.info.version.label=Version -viewer.utilityPane.signatures.cert.dialog.info.version.value=v{0} -viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label=Serial Number -viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value={0} -viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label=Signature Algorithm -viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value={0} -viewer.utilityPane.signatures.cert.dialog.info.issuer.label=Issuer -viewer.utilityPane.signatures.cert.dialog.info.issuer.value=Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} -viewer.utilityPane.signatures.cert.dialog.info.validity.label=Validity -viewer.utilityPane.signatures.cert.dialog.info.validity.value=From: {0}\n To: {1} -viewer.utilityPane.signatures.cert.dialog.info.subject.label=Subject -viewer.utilityPane.signatures.cert.dialog.info.subject.value=Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} -viewer.utilityPane.signatures.cert.dialog.info.signature.label=Signature -viewer.utilityPane.signatures.cert.dialog.info.md5.label=MD5 Fingerprint -viewer.utilityPane.signatures.cert.dialog.info.md5.value={0} -viewer.utilityPane.signatures.cert.dialog.info.sha1.label=SHA1 Fingerprint -viewer.utilityPane.signatures.cert.dialog.info.sha1.value={0} -viewer.utilityPane.signatures.verify.initializingMessage.label=Validating {0} of {1} Signatures -viewer.utilityPane.signatures.verify.completeMessage.label=Validating process complete -viewer.utilityPane.signatures.verify.validating.label=Validating signature... +viewer.utilityPane.signatures.cert.dialog.title = Certificate Details +viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close +viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C +viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A +viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject +viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer +viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1} +viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field +viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value +viewer.utilityPane.signatures.cert.dialog.info.version.label = Version +viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0} +viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number +viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm +viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer +viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \ + Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} +viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity +viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1} +viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject +viewer.utilityPane.signatures.cert.dialog.info.subject.value = \ + Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} +viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature +viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint +viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint +viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0} +viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures +viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete +viewer.utilityPane.signatures.verify.validating.label = Validating signature... ## Annotation Tab -viewer.utilityPane.annotation.tab.title=Annotations +viewer.utilityPane.annotation.tab.title = Annotations ## Utility Pane Annotation Link Tab -viewer.utilityPane.annotation.link.appearance.title=Link Annotation -viewer.utilityPane.annotation.link.highlightType=Highlight Style: -viewer.utilityPane.annotation.link.none=None -viewer.utilityPane.annotation.link.invert=Invert` -viewer.utilityPane.annotation.link.outline=Outline -viewer.utilityPane.annotation.link.push=Push +viewer.utilityPane.annotation.link.appearance.title = Link Annotation +viewer.utilityPane.annotation.link.highlightType = Highlight Style: +viewer.utilityPane.annotation.link.none = None +viewer.utilityPane.annotation.link.invert = Invert` +viewer.utilityPane.annotation.link.outline = Outline +viewer.utilityPane.annotation.link.push = Push ## Utility Pane Annotation text markup Tab -viewer.utilityPane.annotation.textMarkup.appearance.title=Text Markup Annotation -viewer.utilityPane.annotation.textMarkup.highlightType=Type: -viewer.utilityPane.annotation.textMarkup.colorChooserTitle=MarKup Color -viewer.utilityPane.annotation.textMarkup.colorLabel=Color: -viewer.utilityPane.annotation.textMarkup.transparencyLabel=Transparency: +viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation +viewer.utilityPane.annotation.textMarkup.highlightType = Type: +viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color +viewer.utilityPane.annotation.textMarkup.colorLabel = Color: +viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency: ## Utility Pane Annotation line Tab -viewer.utilityPane.annotation.line.appearance.title=Line Annotation -viewer.utilityPane.annotation.line.lineThickness=Line Thickness: -viewer.utilityPane.annotation.line.lineStyle=Line Style: -viewer.utilityPane.annotation.line.startStyle=Start: -viewer.utilityPane.annotation.line.endStyle=End: -viewer.utilityPane.annotation.line.colorChooserTitle=Line Color -viewer.utilityPane.annotation.line.colorInternalChooserTitle=Line Internal Color -viewer.utilityPane.annotation.line.colorLabel=Color: -viewer.utilityPane.annotation.line.colorInternalLabel=Fill Color: -viewer.utilityPane.annotation.line.end.none=None -viewer.utilityPane.annotation.line.end.openArrow=Open Arrow -viewer.utilityPane.annotation.line.end.closedArrow=Closed Arrow -viewer.utilityPane.annotation.line.end.diamond=Diamond -viewer.utilityPane.annotation.line.end.square=Square -viewer.utilityPane.annotation.line.end.circle=Circle -viewer.utilityPane.annotation.line.transparencyLabel=Transparency: +viewer.utilityPane.annotation.line.appearance.title = Line Annotation +viewer.utilityPane.annotation.line.lineThickness = Line Thickness: +viewer.utilityPane.annotation.line.lineStyle = Line Style: +viewer.utilityPane.annotation.line.startStyle = Start: +viewer.utilityPane.annotation.line.endStyle = End: +viewer.utilityPane.annotation.line.colorChooserTitle = Line Color +viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color +viewer.utilityPane.annotation.line.colorLabel = Color: +viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color: +viewer.utilityPane.annotation.line.end.none = None +viewer.utilityPane.annotation.line.end.openArrow = Open Arrow +viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow +viewer.utilityPane.annotation.line.end.diamond = Diamond +viewer.utilityPane.annotation.line.end.square = Square +viewer.utilityPane.annotation.line.end.circle = Circle +viewer.utilityPane.annotation.line.transparencyLabel = Transparency: ## Utility Pane Annotation square Tab -viewer.utilityPane.annotation.square.appearance.title=Square Annotation -viewer.utilityPane.annotation.square.lineThickness=Border Thickness: -viewer.utilityPane.annotation.square.lineStyle=Border Style: -viewer.utilityPane.annotation.square.colorBorderChooserTitle=Border Color -viewer.utilityPane.annotation.square.colorInteriorChooserTitle=Fill Color -viewer.utilityPane.annotation.square.borderTypeLabel=Border Type: -viewer.utilityPane.annotation.square.colorBorderLabel=Border Color: -viewer.utilityPane.annotation.square.colorInteriorLabel=Fill Color: -viewer.utilityPane.annotation.square.fillTypeLabel=Fill Type: -viewer.utilityPane.annotation.square.transparencyLabel=Transparency: +viewer.utilityPane.annotation.square.appearance.title = Square Annotation +viewer.utilityPane.annotation.square.lineThickness = Border Thickness: +viewer.utilityPane.annotation.square.lineStyle = Border Style: +viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color +viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color +viewer.utilityPane.annotation.square.borderTypeLabel = Border Type: +viewer.utilityPane.annotation.square.colorBorderLabel = Border Color: +viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color: +viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type: +viewer.utilityPane.annotation.square.transparencyLabel = Transparency: ## Utility Pane Annotation free text Tab -viewer.utilityPane.annotation.freeText.appearance.title=FreeText Annotation -viewer.utilityPane.annotation.freeText.font.name=Font Name: -viewer.utilityPane.annotation.freeText.font.style=Font Style: -viewer.utilityPane.annotation.freeText.font.size=Font Size: -viewer.utilityPane.annotation.freeText.font.color=Font Color: -viewer.utilityPane.annotation.freeText.font.color.ChooserTitle=Font Color -viewer.utilityPane.annotation.freeText.border.thickness=Border Thickness: -viewer.utilityPane.annotation.freeText.border.type=Border Type: -viewer.utilityPane.annotation.freeText.border.style=Border Style: -viewer.utilityPane.annotation.freeText.border.color=Border Color: -viewer.utilityPane.annotation.freeText.border.color.ChooserTitle=Border Color -viewer.utilityPane.annotation.freeText.fill.type=Fill Type: -viewer.utilityPane.annotation.freeText.fill.color=Fill Color: -viewer.utilityPane.annotation.freeText.transparencyLabel=Transparency: -viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle=Fill Color -viewer.utilityPane.annotation.freeText.font.dialog=Dialog -viewer.utilityPane.annotation.freeText.font.dialogInput=DialogInput -viewer.utilityPane.annotation.freeText.font.monospaced=Monospaced -viewer.utilityPane.annotation.freeText.font.serif=Serif -viewer.utilityPane.annotation.freeText.font.sanSerif=SansSerif -viewer.utilityPane.annotation.freeText.font.style.plain=Plain -viewer.utilityPane.annotation.freeText.font.style.italic=Italic -viewer.utilityPane.annotation.freeText.font.style.bold=Bold -viewer.utilityPane.annotation.freeText.font.name.helvetica=Helvetica -viewer.utilityPane.annotation.freeText.font.name.helveticaOblique=Helvetica-Oblique -viewer.utilityPane.annotation.freeText.font.name.helveticaBold=Helvetica-Bold -viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique=Helvetica-BoldOblique -viewer.utilityPane.annotation.freeText.font.name.timesItalic=Times-Italic -viewer.utilityPane.annotation.freeText.font.name.timesBold=Times-Bold -viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic=Times-BoldItalic -viewer.utilityPane.annotation.freeText.font.name.timesRoman=Times-Roman -viewer.utilityPane.annotation.freeText.font.name.courier=Courier -viewer.utilityPane.annotation.freeText.font.name.courierOblique=Courier-Oblique -viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique=Courier-BoldOblique -viewer.utilityPane.annotation.freeText.font.name.courierBold=Courier-Bold +viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation +viewer.utilityPane.annotation.freeText.font.name = Font Name: +viewer.utilityPane.annotation.freeText.font.style = Font Style: +viewer.utilityPane.annotation.freeText.font.size = Font Size: +viewer.utilityPane.annotation.freeText.font.color = Font Color: +viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color +viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness: +viewer.utilityPane.annotation.freeText.border.type = Border Type: +viewer.utilityPane.annotation.freeText.border.style = Border Style: +viewer.utilityPane.annotation.freeText.border.color = Border Color: +viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color +viewer.utilityPane.annotation.freeText.fill.type = Fill Type: +viewer.utilityPane.annotation.freeText.fill.color = Fill Color: +viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency: +viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color +viewer.utilityPane.annotation.freeText.font.dialog = Dialog +viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput +viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced +viewer.utilityPane.annotation.freeText.font.serif = Serif +viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif +viewer.utilityPane.annotation.freeText.font.style.plain = Plain +viewer.utilityPane.annotation.freeText.font.style.italic = Italic +viewer.utilityPane.annotation.freeText.font.style.bold = Bold +viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica +viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique +viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold +viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique +viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic +viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold +viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic +viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman +viewer.utilityPane.annotation.freeText.font.name.courier = Courier +viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique +viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique +viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold ## Utility Pane Annotation text Tab -viewer.utilityPane.annotation.text.appearance.title=Text Annotation -viewer.utilityPane.annotation.text.iconName=Icon: -viewer.utilityPane.annotation.text.iconName.comment=Comment -viewer.utilityPane.annotation.text.iconName.check=Check -viewer.utilityPane.annotation.text.iconName.checkMark=CheckMark -viewer.utilityPane.annotation.text.iconName.circle=Circle -viewer.utilityPane.annotation.text.iconName.cross=Cross -viewer.utilityPane.annotation.text.iconName.crossHairs=CrossHairs -viewer.utilityPane.annotation.text.iconName.help=Help -viewer.utilityPane.annotation.text.iconName.insert=Insert -viewer.utilityPane.annotation.text.iconName.key=Key -viewer.utilityPane.annotation.text.iconName.newParagraph=NewParagraph -viewer.utilityPane.annotation.text.iconName.paragraph=Paragraph -viewer.utilityPane.annotation.text.iconName.rightArrow=RightArrow -viewer.utilityPane.annotation.text.iconName.rightPointer=RightPointer -viewer.utilityPane.annotation.text.iconName.star=Star -viewer.utilityPane.annotation.text.iconName.upArrow=UpArrow -viewer.utilityPane.annotation.text.iconName.upLeftArrow=UpLeftArrow +viewer.utilityPane.annotation.text.appearance.title = Text Annotation +viewer.utilityPane.annotation.text.iconName = Icon: +viewer.utilityPane.annotation.text.iconName.comment = Comment +viewer.utilityPane.annotation.text.iconName.check = Check +viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark +viewer.utilityPane.annotation.text.iconName.circle = Circle +viewer.utilityPane.annotation.text.iconName.cross = Cross +viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs +viewer.utilityPane.annotation.text.iconName.help = Help +viewer.utilityPane.annotation.text.iconName.insert = Insert +viewer.utilityPane.annotation.text.iconName.key = Key +viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph +viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph +viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow +viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer +viewer.utilityPane.annotation.text.iconName.star = Star +viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow +viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow ## Utility Pane Annotation circle Tab -viewer.utilityPane.annotation.circle.appearance.title=Circle Annotation -viewer.utilityPane.annotation.circle.lineThickness=Border Thickness: -viewer.utilityPane.annotation.circle.lineStyle=Border Style: -viewer.utilityPane.annotation.circle.colorBorderChooserTitle=Border Color -viewer.utilityPane.annotation.circle.colorInteriorChooserTitle=Interior Color -viewer.utilityPane.annotation.circle.colorBorderLabel=Border Color: -viewer.utilityPane.annotation.circle.colorInteriorLabel=Fill Color: -viewer.utilityPane.annotation.circle.fillTypeLabel=Fill Type: -viewer.utilityPane.annotation.circle.transparencyLabel=Transparency: +viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation +viewer.utilityPane.annotation.circle.lineThickness = Border Thickness: +viewer.utilityPane.annotation.circle.lineStyle = Border Style: +viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color +viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color +viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color: +viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color: +viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type: +viewer.utilityPane.annotation.circle.transparencyLabel = Transparency: ## Utility Pane Annotation ink Tab -viewer.utilityPane.annotation.ink.appearance.title=Ink Annotation -viewer.utilityPane.annotation.ink.lineThickness=Ink Thickness: -viewer.utilityPane.annotation.ink.lineStyle=Ink Style: -viewer.utilityPane.annotation.ink.colorBorderChooserTitle=Ink Color -viewer.utilityPane.annotation.ink.colorBorderLabel=Ink Color: -viewer.utilityPane.annotation.ink.transparencyLabel=Transparency: +viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation +viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness: +viewer.utilityPane.annotation.ink.lineStyle = Ink Style: +viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color +viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color: +viewer.utilityPane.annotation.ink.transparencyLabel = Transparency: ## Utility Pane border Tab -viewer.utilityPane.annotation.border.title=Border -viewer.utilityPane.annotation.border.linkType=Border Type: -viewer.utilityPane.annotation.border.lineThickness=Border Thickness: -viewer.utilityPane.annotation.border.lineStyle=Border Style: -viewer.utilityPane.annotation.border.colorChooserTitle=Border Color -viewer.utilityPane.annotation.border.colorLabel=Color: -viewer.utilityPane.annotation.border.borderType.visibleRectangle=Visible -viewer.utilityPane.annotation.border.borderType.invisibleRectangle=Invisible -viewer.utilityPane.annotation.border.solid=Solid -viewer.utilityPane.annotation.border.dashed=Dashed -viewer.utilityPane.annotation.border.beveled=Beveled -viewer.utilityPane.annotation.border.inset=Inset -viewer.utilityPane.annotation.border.underline=Underline +viewer.utilityPane.annotation.border.title = Border +viewer.utilityPane.annotation.border.linkType = Border Type: +viewer.utilityPane.annotation.border.lineThickness = Border Thickness: +viewer.utilityPane.annotation.border.lineStyle = Border Style: +viewer.utilityPane.annotation.border.colorChooserTitle = Border Color +viewer.utilityPane.annotation.border.colorLabel = Color: +viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible +viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible +viewer.utilityPane.annotation.border.solid = Solid +viewer.utilityPane.annotation.border.dashed = Dashed +viewer.utilityPane.annotation.border.beveled = Beveled +viewer.utilityPane.annotation.border.inset = Inset +viewer.utilityPane.annotation.border.underline = Underline ## Utility Pane border Tab -viewer.utilityPane.annotation.flags.title=Flags -viewer.utilityPane.annotation.flags.noRotate=No Rotate: -viewer.utilityPane.annotation.flags.noZoom=No Zoom: -viewer.utilityPane.annotation.flags.readOnly=Read Only: -viewer.utilityPane.annotation.flags.printable=Printable: -viewer.utilityPane.annotation.flags.yes=Printable: -viewer.utilityPane.annotation.flags.enabled=Enabled -viewer.utilityPane.annotation.flags.disabled=Disabled +viewer.utilityPane.annotation.flags.title = Flags +viewer.utilityPane.annotation.flags.noRotate = No Rotate: +viewer.utilityPane.annotation.flags.noZoom = No Zoom: +viewer.utilityPane.annotation.flags.readOnly = Read Only: +viewer.utilityPane.annotation.flags.printable = Printable: +viewer.utilityPane.annotation.flags.yes = Printable: +viewer.utilityPane.annotation.flags.enabled = Enabled +viewer.utilityPane.annotation.flags.disabled = Disabled ## annotation action pane and dialogs. -viewer.utilityPane.action.selectionTitle=Action -viewer.utilityPane.action.addAction=Add -viewer.utilityPane.action.editAction=Edit -viewer.utilityPane.action.removeAction=Remove -viewer.utilityPane.action.type.destination.label=Destination -viewer.utilityPane.action.type.uriAction.label=URI Action -viewer.utilityPane.action.type.goToAction.label=GoTo Action -viewer.utilityPane.action.type.launchAction.label=Launch Action -viewer.utilityPane.action.dialog.new.title=Add New Action -viewer.utilityPane.action.dialog.new.msgs=Action Type: -viewer.utilityPane.action.dialog.delete.title=Delete Confirmation -viewer.utilityPane.action.dialog.delete.msgs=Are you sure your want to delete this action? +viewer.utilityPane.action.selectionTitle = Action +viewer.utilityPane.action.addAction = Add +viewer.utilityPane.action.editAction = Edit +viewer.utilityPane.action.removeAction = Remove +viewer.utilityPane.action.type.destination.label = Destination +viewer.utilityPane.action.type.uriAction.label = URI Action +viewer.utilityPane.action.type.goToAction.label = GoTo Action +viewer.utilityPane.action.type.launchAction.label = Launch Action +viewer.utilityPane.action.dialog.new.title = Add New Action +viewer.utilityPane.action.dialog.new.msgs = Action Type: +viewer.utilityPane.action.dialog.delete.title = Delete Confirmation +viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action? ## uri action dialog test -viewer.utilityPane.action.dialog.uri.title=URI Action Properties -viewer.utilityPane.action.dialog.uri.msgs=URI: +viewer.utilityPane.action.dialog.uri.title = URI Action Properties +viewer.utilityPane.action.dialog.uri.msgs = URI: ## launch action dialog test -viewer.utilityPane.action.dialog.launch.title=Launch Action Properties -viewer.utilityPane.action.dialog.launch.msgs=File Path: +viewer.utilityPane.action.dialog.launch.title = Launch Action Properties +viewer.utilityPane.action.dialog.launch.msgs = File Path: ## GoTo action dialog text -viewer.utilityPane.action.dialog.goto.title=GoTo Action Properties -viewer.utilityPane.action.dialog.goto.page.label=Page: -viewer.utilityPane.action.dialog.goto.type.label=Type -viewer.utilityPane.action.dialog.goto.type.xyz.label=Absolute -viewer.utilityPane.action.dialog.goto.type.fit.label=Fit Page -viewer.utilityPane.action.dialog.goto.type.fith.label=Fit Top Width -viewer.utilityPane.action.dialog.goto.type.fitv.label=Fit Left Width -viewer.utilityPane.action.dialog.goto.type.fitr.label=Fit Zoom Box -viewer.utilityPane.action.dialog.goto.type.fitb.label=Fit Page Bounds -viewer.utilityPane.action.dialog.goto.type.fitbh.label=Fit Bounds Top -viewer.utilityPane.action.dialog.goto.type.fitbv.label=Fit Bounds Left -viewer.utilityPane.action.dialog.goto.right.label=Right: -viewer.utilityPane.action.dialog.goto.left.label=Left: -viewer.utilityPane.action.dialog.goto.top.label=Top: -viewer.utilityPane.action.dialog.goto.bottom.label=Bottom: -viewer.utilityPane.action.dialog.goto.zoom.label=Zoom: -viewer.utilityPane.action.dialog.goto.unassigned.label=NaN -viewer.utilityPane.action.dialog.goto.current.label=Current View: -viewer.utilityPane.action.dialog.goto.current=Set Location -viewer.utilityPane.action.dialog.goto.name.label=Name: -viewer.utilityPane.action.dialog.goto.browse=Browse... -viewer.utilityPane.action.dialog.goto.explicitDestination.title=Implicit Destination -viewer.utilityPane.action.dialog.goto.nameDestination.title=Named Destination +viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties +viewer.utilityPane.action.dialog.goto.page.label = Page: +viewer.utilityPane.action.dialog.goto.type.label = Type +viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute +viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page +viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width +viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width +viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box +viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds +viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top +viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left +viewer.utilityPane.action.dialog.goto.right.label = Right: +viewer.utilityPane.action.dialog.goto.left.label = Left: +viewer.utilityPane.action.dialog.goto.top.label = Top: +viewer.utilityPane.action.dialog.goto.bottom.label = Bottom: +viewer.utilityPane.action.dialog.goto.zoom.label = Zoom: +viewer.utilityPane.action.dialog.goto.unassigned.label = NaN +viewer.utilityPane.action.dialog.goto.current.label = Current View: +viewer.utilityPane.action.dialog.goto.current = Set Location +viewer.utilityPane.action.dialog.goto.name.label = Name: +viewer.utilityPane.action.dialog.goto.browse = Browse... +viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination +viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination # Destination Named Tree -viewer.utilityPane.action.dialog.goto.nameTree.title=Document Name Tree -viewer.utilityPane.action.dialog.goto.nameTree.root.label=Name Tree -viewer.utilityPane.action.dialog.goto.nameTree.branch.label={0} to {1} +viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree +viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree +viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1} ## Utility Pane Search Tab -viewer.utilityPane.search.tab.title=Search -viewer.utilityPane.search.searchText.label=Search Text: -viewer.utilityPane.search.results.label=Results: -viewer.utilityPane.search.searchButton.label=Search -viewer.utilityPane.search.clearSearchButton.label=Clear -viewer.utilityPane.search.caseSenstiveCheckbox.label=Case-sensitive -viewer.utilityPane.search.wholeWordCheckbox.label=Whole words only -viewer.utilityPane.search.cumlitiveCheckbox.label=Cumulative -viewer.utilityPane.search.showPagesCheckbox.label=Show Pages -viewer.utilityPane.search.stopButton.label=Stop -viewer.utilityPane.search.searching.msg=Search... +viewer.utilityPane.search.tab.title = Search +viewer.utilityPane.search.searchText.label = Search Text: +viewer.utilityPane.search.results.label = Results: +viewer.utilityPane.search.searchButton.label = Search +viewer.utilityPane.search.clearSearchButton.label = Clear +viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive +viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only +viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative +viewer.utilityPane.search.showPagesCheckbox.label = Show Pages +viewer.utilityPane.search.stopButton.label = Stop +viewer.utilityPane.search.searching.msg = Search... # Searching x out of y page(s) -viewer.utilityPane.search.searching1.msg=Searching {0} out of {1} -viewer.utilityPane.search.searching1.oneFile.msg={2} page -viewer.utilityPane.search.searching1.moreFile.msg={2} pages +viewer.utilityPane.search.searching1.msg = \ + Searching {0} out of {1} +viewer.utilityPane.search.searching1.oneFile.msg = {2} page +viewer.utilityPane.search.searching1.moreFile.msg = {2} pages # Page x (y result(s)) -viewer.utilityPane.search.result.msg=Page {0} ({1}) -viewer.utilityPane.search.result.oneFile.msg={2} result -viewer.utilityPane.search.result.moreFile.msg={2} results +viewer.utilityPane.search.result.msg = Page {0} ({1}) +viewer.utilityPane.search.result.oneFile.msg = {2} result +viewer.utilityPane.search.result.moreFile.msg = {2} results # Searched x page(s) (y matches) -viewer.utilityPane.search.progress.msg=Searched {0} {1} ({2}) -viewer.utilityPane.search.progress.onePage.msg=page -viewer.utilityPane.search.progress.morePage.msg=pages -viewer.utilityPane.search.progress.oneMatch.msg={2} match -viewer.utilityPane.search.progress.moreMatch.msg={2} matches +viewer.utilityPane.search.progress.msg = \ + Searched {0} {1} ({2}) +viewer.utilityPane.search.progress.onePage.msg = page +viewer.utilityPane.search.progress.morePage.msg = pages +viewer.utilityPane.search.progress.oneMatch.msg = {2} match +viewer.utilityPane.search.progress.moreMatch.msg = {2} matches ## Popup Annotation component -viewer.annotation.popup.reply.label=Reply -viewer.annotation.popup.delete.label=Delete -viewer.annotation.popup.status.label=Set Status -viewer.annotation.popup.status.accepted.label=Accepted -viewer.annotation.popup.status.cancelled.label=Cancelled -viewer.annotation.popup.status.completed.label=Completed -viewer.annotation.popup.status.rejected.label=Rejected -viewer.annotation.popup.status.none.label=None -viewer.annotation.popup.openAll.label=Open all Popups -viewer.annotation.popup.minimizeAll.label=Minimize Popups -viewer.annotation.popup.replyTo.label=Re: {0} -viewer.annotation.popup.status.none.title=None: {0} -viewer.annotation.popup.status.none.msg=None set by {0} -viewer.annotation.popup.status.accepted.title=Accepted: {0} -viewer.annotation.popup.status.accepted.msg=Accepted set by {0} -viewer.annotation.popup.status.cancelled.title=Cancelled: {0} -viewer.annotation.popup.status.cancelled.msg=Cancelled set by {0} -viewer.annotation.popup.status.completed.title=Completed: {0} -viewer.annotation.popup.status.completed.msg=Completed set by {0} -viewer.annotation.popup.status.rejected.title=Rejected: {0} -viewer.annotation.popup.status.rejected.msg=Rejected set by {0} +viewer.annotation.popup.reply.label = Reply +viewer.annotation.popup.delete.label = Delete +viewer.annotation.popup.status.label = Set Status +viewer.annotation.popup.status.accepted.label = Accepted +viewer.annotation.popup.status.cancelled.label = Cancelled +viewer.annotation.popup.status.completed.label = Completed +viewer.annotation.popup.status.rejected.label = Rejected +viewer.annotation.popup.status.none.label = None +viewer.annotation.popup.openAll.label = Open all Popups +viewer.annotation.popup.minimizeAll.label = Minimize Popups +viewer.annotation.popup.replyTo.label = Re: {0} +viewer.annotation.popup.status.none.title = None: {0} +viewer.annotation.popup.status.none.msg = None set by {0} +viewer.annotation.popup.status.accepted.title = Accepted: {0} +viewer.annotation.popup.status.accepted.msg = Accepted set by {0} +viewer.annotation.popup.status.cancelled.title = Cancelled: {0} +viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0} +viewer.annotation.popup.status.completed.title = Completed: {0} +viewer.annotation.popup.status.completed.msg = Completed set by {0} +viewer.annotation.popup.status.rejected.title = Rejected: {0} +viewer.annotation.popup.status.rejected.msg = Rejected set by {0} ## Signature component -viewer.annotation.signature.menu.validateSignature.label=Validate Signature -viewer.annotation.signature.menu.showCertificates.label=Show Certificate Properties -viewer.annotation.signature.menu.signatureProperties.label=Show Signature Properties -viewer.annotation.signature.menu.signaturePageNavigation.label=Go to Page... +viewer.annotation.signature.menu.validateSignature.label = Validate Signature +viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties +viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties +viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page... ## Signature validation dialog. -viewer.annotation.signature.validation.dialog.title=Signature Validation Summary -viewer.annotation.signature.validation.dialog.close.button.label=Close -viewer.annotation.signature.validation.dialog.signerProperties.button.label=Signature Properties... +viewer.annotation.signature.validation.dialog.title = Signature Validation Summary +viewer.annotation.signature.validation.dialog.close.button.label = Close +viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties... # common validation messages -viewer.annotation.signature.validation.common.invalid.label=Signature is invalid: -viewer.annotation.signature.validation.common.unknown.label=Signature is valid: -viewer.annotation.signature.validation.common.valid.label=Signature validity is unknown: -viewer.annotation.signature.validation.common.signedBy.label=- Signed by {0} {1} -viewer.annotation.signature.validation.common.doc.modified.label=- This version of the document is unaltered but subsequent changes have been made -viewer.annotation.signature.validation.common.doc.unmodified.label=- Document has not been modified since it was signed -viewer.annotation.signature.validation.common.doc.major.label=- Document has been altered or corrupted since it was signed -viewer.annotation.signature.validation.common.identity.unknown.label=- Signer's identity is unknown because it could not be found in your keystore -viewer.annotation.signature.validation.common.identity.unchecked.label=- Signature is valid, but revocation of the signer's identity could not be checked -viewer.annotation.signature.validation.common.identity.valid.label=- Signer's identity is valid -viewer.annotation.signature.validation.common.time.local.label=- Signing time is from the clock on this signer's computer -viewer.annotation.signature.validation.common.time.embedded.label=- Signature included an embedded timestamp but it could not be validated -viewer.annotation.signature.validation.common.notAvailable.label=N/A +viewer.annotation.signature.validation.common.invalid.label = Signature is invalid: +viewer.annotation.signature.validation.common.unknown.label = Signature is valid: +viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown: +viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1} +viewer.annotation.signature.validation.common.doc.modified.label = \ + - This version of the document is unaltered but subsequent changes have been made +viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed +viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed +viewer.annotation.signature.validation.common.identity.unknown.label = \ + - Signer's identity is unknown because it could not be found in your keystore +viewer.annotation.signature.validation.common.identity.unchecked.label = \ + - Signature is valid, but revocation of the signer's identity could not be checked +viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid +viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer +viewer.annotation.signature.validation.common.time.embedded.label = \ + - Signature included an embedded timestamp but it could not be validated +viewer.annotation.signature.validation.common.notAvailable.label = N/A ## Signatures properties Dialog. -viewer.annotation.signature.properties.dialog.title=Signature Properties -viewer.annotation.signature.properties.dialog.invalid.label=Signature is invalid -viewer.annotation.signature.properties.dialog.unknown.label=Signature is valid -viewer.annotation.signature.properties.dialog.valid.label=Signature validity is unknown -viewer.annotation.signature.properties.dialog.signedBy.label=Signed by {0} {1} -viewer.annotation.signature.properties.dialog.signingTime.label=Signed time: {0} -viewer.annotation.signature.properties.dialog.reason.label=Reason: {0} -viewer.annotation.signature.properties.dialog.location.label=Location: {0} +viewer.annotation.signature.properties.dialog.title = Signature Properties +viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid +viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid +viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown +viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1} +viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0} +viewer.annotation.signature.properties.dialog.reason.label = Reason: {0} +viewer.annotation.signature.properties.dialog.location.label = Location: {0} # SignatureSigner Info -viewer.annotation.signature.properties.dialog.pathValidation.success=- Path validation checks were successful. -viewer.annotation.signature.properties.dialog.pathValidation.failure=- Path validation checks were unsuccessful. -viewer.annotation.signature.properties.dialog.revocation.success=- Signer's certificate is valid and has not been revoked. -viewer.annotation.signature.properties.dialog.revocation.failure=- Revocation checking was not performed. -viewer.annotation.signature.properties.dialog.certificateExpired.failure=- Signer certificate has expired. -viewer.annotation.signature.properties.dialog.showCertificates.label=Signer's Certificate... -viewer.annotation.signature.properties.dialog.validity.title=Validity Summary -viewer.annotation.signature.properties.dialog.signerInfo.title=Signer Info +viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful. +viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful. +viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked. +viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed. +viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired. +viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate... +viewer.annotation.signature.properties.dialog.validity.title = Validity Summary +viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info ## Common Button Labels -viewer.button.ok.label=Ok -viewer.button.ok.mnemonic=O -viewer.button.cancel.label=Cancel -viewer.button.cancel.mnemonic=C +viewer.button.ok.label = Ok +viewer.button.ok.mnemonic = O +viewer.button.cancel.label = Cancel +viewer.button.cancel.mnemonic = C ## Pilot Specific Mesages -pilot.title=ICEbrowser - ICEpdf Pilot Errror -pilot.loading.msg=Opening document {0} ... -pilot.display.msg=Displaying {0} -pilot.loading.error.msg=PDF Pilot: Failed to load {0}. -pilot.error.classLoading=Required class {0} not found. Required library 'icepdf.jar' may not be on the classpath - PDF Pilot disabled."; +pilot.title = ICEbrowser - ICEpdf Pilot Errror +pilot.loading.msg =Opening document {0} ... +pilot.display.msg = Displaying {0} +pilot.loading.error.msg = PDF Pilot: Failed to load {0}. +pilot.error.classLoading = Required class {0} not found. Required library \ + 'icepdf.jar' may not be on the classpath - PDF Pilot disabled."; ### # General Error Messages # Command Line Errors -viewer.commandLin.error=Usage: java org.icepdf.ri.viewer.Main [-loadfile ] [-loadurl ] +viewer.commandLin.error = \ + Usage: java org.icepdf.ri.viewer.Main [-loadfile ] [-loadurl ] # Launcher errors -viewer.launcher.URLError.dialog.title=ICEsoft ICEpdf -viewer.launcher.URLError.dialog.message=ICEpdf could not open the specified file. {0} at URL: {1}. -viewer.launcher.lookAndFeel.error.message=The specified look-and-feel ({0}) is not accessible from this platform. +viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf +viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}. +viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform. # Pilot Loading Errors ### parser error dialogs -parse.title=Properties Parsing Error -parse.integer=Warning : {0} is not a correct integer. -parse.float=Warning : {0} is not a correct float. -parse.double=Warning : {0} is not a correct double. -parse.choice=Warning : {0} is not a valid choice. -parse.laf=Warning : look-and-feel {0} is not supported. +parse.title = Properties Parsing Error +parse.integer = Warning : {0} is not a correct integer. +parse.float = Warning : {0} is not a correct float. +parse.double = Warning : {0} is not a correct double. +parse.choice = Warning : {0} is not a valid choice. +parse.laf = Warning : look-and-feel {0} is not supported. ### Properties Manager Errors -manager.properties.title=ICEpdf Properties Manager -fontManager.properties.title=ICEpdf Font Manager +manager.properties.title = ICEpdf Properties Manager +fontManager.properties.title = ICEpdf Font Manager -manager.properties.createNewDirectory=To create the directory {0},\nwhere the ICEpdf Viewer will store changes to its setup, click Yes.\n\nIf you click "No", all changes you make to the ICEpdf Viewer setup\nwill be lost when you quit the application. \n\n +manager.properties.createNewDirectory = \ + To create the directory {0},\n\ + where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\ + If you click "No", all changes you make to the ICEpdf Viewer setup\n\ + will be lost when you quit the application. \n\n -manager.properties.failedCreation=ICEpdf Viewer directory to store user data can not be created:\n{0}\nICEpdf Viewer will not save changes to its default setup. +manager.properties.failedCreation = \ + ICEpdf Viewer directory to store user data can not be created:\n\ + {0}\n\ + ICEpdf Viewer will not save changes to its default setup. -manager.properties.session.nolock=Error creating the lock file :\n{0}\n +manager.properties.session.nolock = \ + Error creating the lock file :\n\ + {0}\n -manager.properties.session.readError=Error loading properties file: \n{0} +manager.properties.session.readError = \ + Error loading properties file: \n\ + {0} -manager.properties.deleted=Property file has been deleted\n({0})\nRecreate it ? +manager.properties.deleted = Property file has been deleted\n\ + ({0})\n\ + Recreate it ? -manager.properties.modified=Property file has been modified since last update\n({0,date,long})\nWould you like to merge changes in the file with the current properties? +manager.properties.modified = Property file has been modified since last update\n\ +({0,date,long})\n\ +Would you like to merge changes in the file with the current properties? -manager.properties.saveError=Impossible to save property file.\nEncountered the folowing error :\n{0} +manager.properties.saveError = Impossible to save property file.\n\ +Encountered the folowing error :\n\ +{0} -manager.properties.lafError=Look&Feel {0} given in the default properties is unsupported.\nUsing system default. +manager.properties.lafError =\ + Look&Feel {0} given in the default properties is unsupported.\n\ + Using system default. -manager.properties.brokenProperty=Broken default property {0} value: {1} +manager.properties.brokenProperty = Broken default property {0} value: {1} -manager.properties.missingProperty=Missing default property {0} value: {1} +manager.properties.missingProperty = Missing default property {0} value: {1} From e18952ab73b07a93f3d963888afc95351452d3ee Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 6 Jul 2021 10:44:31 -0400 Subject: [PATCH 26/33] 2021-07-08-Change 27 to 29 for correlation types minus custom type --- .../centralrepository/datamodel/CentralRepoDatamodelTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDatamodelTest.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDatamodelTest.java index 62ca12e217..b5424d55a0 100755 --- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDatamodelTest.java +++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDatamodelTest.java @@ -1270,7 +1270,7 @@ public class CentralRepoDatamodelTest extends TestCase { // We expect 10 - the custom type is disabled // Note: this test will need to be updated based on the current default items defined in the correlation_types table - assertTrue("getDefinedCorrelationTypes returned " + types.size() + " enabled entries - expected 27", types.size() == 27); + assertTrue("getDefinedCorrelationTypes returned " + types.size() + " enabled entries - expected 29", types.size() == 29); } catch (CentralRepoException ex) { Exceptions.printStackTrace(ex); Assert.fail(ex.getMessage()); @@ -1282,7 +1282,7 @@ public class CentralRepoDatamodelTest extends TestCase { // We expect 10 - the custom type is not supported // Note: this test will need to be updated based on the current default items defined in the correlation_types table - assertTrue("getDefinedCorrelationTypes returned " + types.size() + " supported entries - expected 27", types.size() == 27); + assertTrue("getDefinedCorrelationTypes returned " + types.size() + " supported entries - expected 29", types.size() == 29); } catch (CentralRepoException ex) { Exceptions.printStackTrace(ex); Assert.fail(ex.getMessage()); From e67fa4c9711b97c0a8cf8381c003c31ab04f1eff Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Tue, 6 Jul 2021 11:07:51 -0400 Subject: [PATCH 27/33] Updated for TSK release --- Core/nbproject/project.properties | 4 ++-- Core/nbproject/project.xml | 8 ++++---- TSKVersion.xml | 2 +- unix_setup.sh | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties index fceb64d406..2b6012ae6b 100644 --- a/Core/nbproject/project.properties +++ b/Core/nbproject/project.properties @@ -109,8 +109,8 @@ file.reference.protobuf-java-util-3.7.0.jar=release\\modules\\ext\\protobuf-java file.reference.Rejistry-1.1-SNAPSHOT.jar=release\\modules\\ext\\Rejistry-1.1-SNAPSHOT.jar file.reference.sevenzipjbinding-AllPlatforms.jar=release\\modules\\ext\\sevenzipjbinding-AllPlatforms.jar file.reference.sevenzipjbinding.jar=release\\modules\\ext\\sevenzipjbinding.jar -file.reference.sleuthkit-4.10.2.jar=release/modules/ext/sleuthkit-4.10.2.jar -file.reference.sleuthkit-caseuco-4.10.2.jar=release/modules/ext/sleuthkit-caseuco-4.10.2.jar +file.reference.sleuthkit-4.11.0.jar=release/modules/ext/sleuthkit-4.11.0.jar +file.reference.sleuthkit-caseuco-4.11.0.jar=release/modules/ext/sleuthkit-caseuco-4.11.0.jar file.reference.slf4j-api-1.7.6.jar=release\\modules\\ext\\slf4j-api-1.7.6.jar file.reference.slf4j-log4j12-1.7.6.jar=release\\modules\\ext\\slf4j-log4j12-1.7.6.jar file.reference.SparseBitSet-1.1.jar=release\\modules\\ext\\SparseBitSet-1.1.jar diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml index ab23992798..efab89ff8b 100644 --- a/Core/nbproject/project.xml +++ b/Core/nbproject/project.xml @@ -682,8 +682,8 @@ release\modules\ext\grpc-alts-1.19.0.jar - ext/sleuthkit-caseuco-4.10.2.jar - release/modules/ext/sleuthkit-caseuco-4.10.2.jar + ext/sleuthkit-caseuco-4.11.0.jar + release/modules/ext/sleuthkit-caseuco-4.11.0.jar ext/jdom-2.0.5.jar @@ -802,8 +802,8 @@ release\modules\ext\sevenzipjbinding-AllPlatforms.jar - ext/sleuthkit-4.10.2.jar - release/modules/ext/sleuthkit-4.10.2.jar + ext/sleuthkit-4.11.0.jar + release/modules/ext/sleuthkit-4.11.0.jar ext/jutf7-1.0.0.jar diff --git a/TSKVersion.xml b/TSKVersion.xml index c0fece9373..0c5ef49ada 100644 --- a/TSKVersion.xml +++ b/TSKVersion.xml @@ -1,3 +1,3 @@ - + diff --git a/unix_setup.sh b/unix_setup.sh index 40b1d858b4..6554689384 100644 --- a/unix_setup.sh +++ b/unix_setup.sh @@ -5,7 +5,7 @@ # NOTE: update_sleuthkit_version.pl updates this value and relies # on it keeping the same name and whitespace. Don't change it. -TSK_VERSION=4.10.2 +TSK_VERSION=4.11.0 # In the beginning... From 9b0e1193bbee29c60639e5157c99dbd5f104656c Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Tue, 6 Jul 2021 11:45:21 -0400 Subject: [PATCH 28/33] Updated for 4.19.0 release --- NEWS.txt | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/NEWS.txt b/NEWS.txt index d9e2f99b90..0b0f29c7c2 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -12,6 +12,12 @@ OS Accounts: - OS accounts appear in a dedicated sub-tree of the main tree view and their properties can be viewed in the results view. - A new content viewer in the lower right area of the main window was built to display OS account data for the item selected in the result view. +Analysis Result and Data Artifacts +- All modules make either Analysis Results or Data Artifacts instead of “Blackboard Artifacts” +- New “Analysis Result” content viewer shows the results for a given file and its score +- The table shows an icon for the aggregate score of a file. +- The tree organizes results into Analysis Results and Data Artifacts instead of simply “Results”. + Discovery UI: - Domain categorization and account types are displayed in Domain Discovery results. - The Domain Discovery results view more explicitly shows when a downloaded file no longer exists. @@ -22,17 +28,42 @@ Ingest Modules: - Parsing of iLEAPP and aLEAPP output was expanded to create communication relationships which can be displayed in the Communications UI. - EML email parsing handles EML messages that are attachments (and have their own attachments). - Domain categorization within Recent Activity can be customized by user-defined rules that can be imported and exported. +- Account IDs and Installed Applications are added to the Central Repository +- Keyword search can be configured to only do OCR and skip non-OCR files. Miscellaneous: - A “Reset Windows” feature was created to help redock windows. - A case-insensitive wordlist of all words in the keyword search index can be exported as a text document. - Information from the Data Source Summary panels can be exported as an Excel spreadsheet. - More artifacts are added to the timeline and artifacts with multiple time-based attributes are mapped to multiple timeline events. -- The Auto Ingest Dashboard is resizable. - Added option to only perform optical character recognition on certain file types. - Heap dumps can be saved to a custom location. +- More detailed error messages about encrypted disks when they are added. +- Added file size filter to Ingest Filters + +Performance: +- Keyword search does not make an explicit commit for each report if ingest is running. +- Language ID is performed on a small subset of a file instead of the entire file +- Recent Activity is more efficient because of TSK changes to file searching (using extension) +- Embedded file extractor module is faster by doing file typing in memory and adding in batches. +- Moved Content Viewers setNode() code and isSupported()/isPreferred() to background threads. +- Moved Data Source Summary Panel population code to background threads. +- Moved Node/Tree queries to background threads. + +Bug Fixes: +- Fixed embedded file extractor file name escaping bug. +- Detect VHD files by signature and not extension +- Fixed iLEAPP path error. +- Content viewers UIs are more consistent - Assorted bug fixes are included. +Auto Ingest: +- The Auto Ingest Dashboard is resizable. +- Get thread dumps from AID +- Added beta Pause feature that pauses auto ingest for a set amount of time. + + + ---------------- VERSION 4.18.0 -------------- Keyword Search: - A major upgrade from Solr 4 to Solr 8.6.3. Single user cases continue to use the embedded server. From 149c3fe05e8eaf851794f22883b847e9cae2731d Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 6 Jul 2021 13:46:13 -0400 Subject: [PATCH 29/33] Added thread dumps and OCR to auto ingest admin panel docs. --- .../auto_ingest_administration.dox | 14 ++++++++++++-- .../images/AutoIngest/admin_jobs_cancel.png | Bin 8331 -> 16673 bytes .../images/AutoIngest/admin_jobs_ocr1.png | Bin 0 -> 93564 bytes .../images/AutoIngest/admin_jobs_ocr2.png | Bin 0 -> 71211 bytes .../images/AutoIngest/admin_jobs_panel.png | Bin 13546 -> 25077 bytes .../images/AutoIngest/admin_nodes_panel.png | Bin 12103 -> 18959 bytes 6 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 docs/doxygen-user/images/AutoIngest/admin_jobs_ocr1.png create mode 100644 docs/doxygen-user/images/AutoIngest/admin_jobs_ocr2.png diff --git a/docs/doxygen-user/auto_ingest_administration.dox b/docs/doxygen-user/auto_ingest_administration.dox index 089a34d474..029a3d47f8 100644 --- a/docs/doxygen-user/auto_ingest_administration.dox +++ b/docs/doxygen-user/auto_ingest_administration.dox @@ -34,7 +34,15 @@ With the admin file in place, the user can right-click on jobs in each of the ta \image html AutoIngest/admin_jobs_panel.png -In the Running Jobs tables, the ingest progress can be viewed and the current job can be cancelled. Note that cancellation can take some time. +You can also selectively enable \ref keyword_search_ocr_config "optical character recognition (OCR)" on a case-by-case basis. This will override the normal Keyword Search settings for every job in the case. Jobs in progress will not be affected. To enable OCR for a case, right-click on a job from that case in the Pending Jobs table and select "Enable OCR For This Case". + +\image html admin_jobs_ocr1.png + +Once enabled, a green checkmark will appear in the OCR column next to every pending job for that case. + +\image html admin_jobs_ocr2.png + +In the Running Jobs tables, the ingest progress can be viewed and the current job can be cancelled. Note that cancellation can take some time. You can also generate a thread dump if you suspect ingest may be stuck. \image html AutoIngest/admin_jobs_cancel.png @@ -42,9 +50,11 @@ In the Completed Jobs table, the user can reprocess a job (generally useful when \image html AutoIngest/admin_jobs_completed.png + + \section auto_ingest_admin_nodes_panel Auto Ingest Nodes Panel -The Nodes panel displays the status of every online auto ingest node. Additionally, an admin can pause or resume a node, or shut down a node entirely (i.e., exit the Autopsy app). +The Nodes panel displays the status of every online auto ingest node. Additionally, an admin can pause or resume a node, generate a thread dump, or shut down a node entirely (i.e., exit the Autopsy app). \image html AutoIngest/admin_nodes_panel.png diff --git a/docs/doxygen-user/images/AutoIngest/admin_jobs_cancel.png b/docs/doxygen-user/images/AutoIngest/admin_jobs_cancel.png index ba3fb81691b05603847ad6216acf2db895c5e631..d8cbd4deee55b6c6a3bb1e384095bdaece0a5e7a 100644 GIT binary patch literal 16673 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 literal 8331 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 diff --git a/docs/doxygen-user/images/AutoIngest/admin_jobs_ocr1.png b/docs/doxygen-user/images/AutoIngest/admin_jobs_ocr1.png new file mode 100644 index 0000000000000000000000000000000000000000..a0db003ca697440fd38630be3b34cf8b4409a201 GIT binary patch literal 93564 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 P9*T13Wz$bz_WXYUineO~ literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/AutoIngest/admin_jobs_panel.png b/docs/doxygen-user/images/AutoIngest/admin_jobs_panel.png index 32dfa89cddc31798d642f1e68d90b91f5565c071..25ad7b19820653e24bc8a8a4c76c1aa982088cac 100644 GIT binary patch literal 25077 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 literal 13546 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 F{{tZ5>NEfV diff --git a/docs/doxygen-user/images/AutoIngest/admin_nodes_panel.png b/docs/doxygen-user/images/AutoIngest/admin_nodes_panel.png index 08488323dd6fb94bfdb73d9cd2f616a08ef29c7f..220b5d65a460cce8115422afa5577c67b3f6e018 100644 GIT binary patch literal 18959 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 p)Ox4FAkjB~e1M=_f{y-H Date: Tue, 6 Jul 2021 14:22:52 -0400 Subject: [PATCH 30/33] EXIF processor to create analysis EXIF results --- .../modules/pictureanalyzer/impls/EXIFProcessor.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/pictureanalyzer/impls/EXIFProcessor.java b/Core/src/org/sleuthkit/autopsy/modules/pictureanalyzer/impls/EXIFProcessor.java index 1fe5964686..99a1920818 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/pictureanalyzer/impls/EXIFProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/pictureanalyzer/impls/EXIFProcessor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2020 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -49,7 +49,6 @@ import org.sleuthkit.autopsy.modules.pictureanalyzer.PictureAnalyzerIngestModule import org.sleuthkit.datamodel.Blackboard; import org.sleuthkit.datamodel.BlackboardArtifact; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF; -import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_USER_CONTENT_SUSPECTED; import org.sleuthkit.datamodel.BlackboardAttribute; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; import org.sleuthkit.datamodel.Content; @@ -150,7 +149,11 @@ public class EXIFProcessor implements PictureProcessor { if (!attributes.isEmpty() && !blackboard.artifactExists(file, TSK_METADATA_EXIF, attributes)) { - final BlackboardArtifact exifArtifact = file.newDataArtifact(new BlackboardArtifact.Type(TSK_METADATA_EXIF), attributes); + final BlackboardArtifact exifArtifact = (file.newAnalysisResult( + BlackboardArtifact.Type.TSK_METADATA_EXIF, + Score.SCORE_NONE, + null, null, null, + attributes)).getAnalysisResult(); final BlackboardArtifact userSuspectedArtifact = file.newAnalysisResult( BlackboardArtifact.Type.TSK_USER_CONTENT_SUSPECTED, Score.SCORE_UNKNOWN, null, null, null, From 9db6e608fc84ab19c6a1e0ba86ba543c94266fda Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 6 Jul 2021 16:41:46 -0400 Subject: [PATCH 31/33] Fixed OS Account creation bug --- .../contentviewers/osaccount/OsAccountDataPanel.java | 9 +++------ Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/osaccount/OsAccountDataPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/osaccount/OsAccountDataPanel.java index 3ab02ed4d7..4eef25539f 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/osaccount/OsAccountDataPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/osaccount/OsAccountDataPanel.java @@ -42,6 +42,7 @@ import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.contentviewers.layout.ContentViewerDefaults; import org.sleuthkit.autopsy.contentviewers.osaccount.SectionData.RowData; +import org.sleuthkit.autopsy.coreutils.TimeZoneUtils; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.Host; @@ -190,12 +191,8 @@ public class OsAccountDataPanel extends JPanel { data.addData(Bundle.OsAccountDataPanel_basic_type(), account.getOsAccountType().isPresent() ? account.getOsAccountType().get().getName() : ""); - Optional crTime = account.getCreationTime(); - if (crTime.isPresent()) { - data.addData(Bundle.OsAccountDataPanel_basic_creationDate(), DATE_FORMAT.format(new Date(crTime.get() * 1000))); - } else { - data.addData(Bundle.OsAccountDataPanel_basic_creationDate(), ""); - } + Optional crTime = account.getCreationTime(); + data.addData(Bundle.OsAccountDataPanel_basic_creationDate(), crTime.isPresent() ? TimeZoneUtils.getFormattedTime(crTime.get()) : ""); return data; } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index 75a6eb971b..759762078b 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -308,7 +308,7 @@ public final class OsAccounts implements AutopsyVisitableItem { Optional creationTimeValue = account.getCreationTime(); String timeDisplayStr - = creationTimeValue.isPresent() ? TimeZoneUtils.getFormattedTime(creationTimeValue.get() * 1000) : ""; + = creationTimeValue.isPresent() ? TimeZoneUtils.getFormattedTime(creationTimeValue.get()) : ""; propertiesSet.put(new NodeProperty<>( Bundle.OsAccounts_createdTimeProperty_name(), From f749d54a087644cb5452e8b448330899bae1a4b5 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 7 Jul 2021 17:30:31 -0400 Subject: [PATCH 32/33] Fixed os account realm issues --- Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java | 2 +- .../org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index 75a6eb971b..9e1d7962d2 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -207,7 +207,7 @@ public final class OsAccounts implements AutopsyVisitableItem { Bundle.OsAccounts_accountRealmNameProperty_name(), Bundle.OsAccounts_accountRealmNameProperty_displayName(), Bundle.OsAccounts_accountRealmNameProperty_desc(), - "")); + realmNames.get(0))); } } } diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java index 092cea047d..e3df208180 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java @@ -1995,7 +1995,7 @@ class ExtractRegistry extends Extract { } else { osAccount = optional.get(); if (userName != null && !userName.isEmpty()) { - OsAccountUpdateResult updateResult= accountMgr.updateCoreWindowsOsAccountAttributes(osAccount, null, userName, null, host); + OsAccountUpdateResult updateResult= accountMgr.updateCoreWindowsOsAccountAttributes(osAccount, null, userName, domainName.isEmpty() ? null : domainName, host); osAccount = updateResult.getUpdatedAccount().orElse(osAccount); } } @@ -2187,7 +2187,7 @@ class ExtractRegistry extends Extract { accountMgr.addExtendedOsAccountAttributes(osAccount, attributes); // update the loginname - accountMgr.updateCoreWindowsOsAccountAttributes(osAccount, null, loginName, null, host); + accountMgr.updateCoreWindowsOsAccountAttributes(osAccount, null, loginName, domainName.isEmpty() ? null : domainName, host); // update other standard attributes - fullname, creationdate accountMgr.updateStandardOsAccountAttributes(osAccount, fullName, null, null, creationTime); From 071b5f4e629c99e0a14f27def821bd60683648be Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 8 Jul 2021 11:04:21 -0400 Subject: [PATCH 33/33] Light editing of 4.19.0 release notes --- NEWS.txt | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/NEWS.txt b/NEWS.txt index 0b0f29c7c2..3ab13cfab3 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -5,18 +5,18 @@ Data Source Management: - The main tree viewer can be configured to group by person and host. OS Accounts: -- Operating System (OS) accounts and realms are their own data types and not generic artifacts. +- Operating System (OS) accounts and realms are their own data types and no longer generic artifacts. - OS Accounts are created for Windows accounts found in the registry. Domain-scoped realms are not fully detected yet. - NTFS files are associated with OS Accounts by SID. - The Recent Activity module associates artifacts with OS Accounts based on SID or path of database. Other modules still need to be updated. - OS accounts appear in a dedicated sub-tree of the main tree view and their properties can be viewed in the results view. -- A new content viewer in the lower right area of the main window was built to display OS account data for the item selected in the result view. +- A new content viewer in the lower right area of the main window was built to display OS account data for the item selected in the results view. Analysis Result and Data Artifacts -- All modules make either Analysis Results or Data Artifacts instead of “Blackboard Artifacts” -- New “Analysis Result” content viewer shows the results for a given file and its score -- The table shows an icon for the aggregate score of a file. -- The tree organizes results into Analysis Results and Data Artifacts instead of simply “Results”. +- All modules make either Analysis Results or Data Artifacts instead of “Blackboard Artifacts.” +- New “Analysis Result” content viewer shows the results for a given file and its score. +- The tabular results viewer shows an icon for the aggregate score of a file. +- The tree organizes results into "Analysis Results" and "Data Artifacts" instead of simply “Results.” Discovery UI: - Domain categorization and account types are displayed in Domain Discovery results. @@ -28,7 +28,7 @@ Ingest Modules: - Parsing of iLEAPP and aLEAPP output was expanded to create communication relationships which can be displayed in the Communications UI. - EML email parsing handles EML messages that are attachments (and have their own attachments). - Domain categorization within Recent Activity can be customized by user-defined rules that can be imported and exported. -- Account IDs and Installed Applications are added to the Central Repository +- Account IDs and Installed Applications are added to the Central Repository. - Keyword search can be configured to only do OCR and skip non-OCR files. Miscellaneous: @@ -39,30 +39,28 @@ Miscellaneous: - Added option to only perform optical character recognition on certain file types. - Heap dumps can be saved to a custom location. - More detailed error messages about encrypted disks when they are added. -- Added file size filter to Ingest Filters +- Added file size filter to Ingest Filters. Performance: - Keyword search does not make an explicit commit for each report if ingest is running. -- Language ID is performed on a small subset of a file instead of the entire file -- Recent Activity is more efficient because of TSK changes to file searching (using extension) -- Embedded file extractor module is faster by doing file typing in memory and adding in batches. -- Moved Content Viewers setNode() code and isSupported()/isPreferred() to background threads. +- Language ID is performed on a small subset of a file instead of the entire file. +- Recent Activity is more efficient because of TSK changes to file searching (using extension). +- Embedded file extractor module has been made faster by doing file typing in memory and adding extracted files in batches. +- Moved Content Viewers setNode() and isSupported()/isPreferred() code to background threads. - Moved Data Source Summary Panel population code to background threads. - Moved Node/Tree queries to background threads. Bug Fixes: - Fixed embedded file extractor file name escaping bug. -- Detect VHD files by signature and not extension +- Detect VHD files by signature and not extension. - Fixed iLEAPP path error. -- Content viewers UIs are more consistent +- Content viewers UIs are more consistent. - Assorted bug fixes are included. Auto Ingest: - The Auto Ingest Dashboard is resizable. - Get thread dumps from AID -- Added beta Pause feature that pauses auto ingest for a set amount of time. - - +- Added beta pause feature that pauses auto ingest for a set amount of time at a scheduled date and time. ---------------- VERSION 4.18.0 -------------- Keyword Search: