From 4475a3dd0a707b0d3bdd923c856e66595cbeeeaf Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 9 Apr 2020 14:38:35 -0400 Subject: [PATCH 01/35] inital save --- .../sleuthkit/autopsy/casemodule/services/TagsManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index 40597e9af3..80374dad75 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -40,6 +40,7 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TagName; +import org.sleuthkit.datamodel.TagSet; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskData.DbType; @@ -268,6 +269,10 @@ public class TagsManager implements Closeable { } return new ArrayList<>(tagNameSet); } + + public List getTagSets() { + return null; + } /** * Gets a map of tag display names to tag name entries in the case database. From 543f5fc4c715f3f4073e9212053df4fb22e024b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20K=C3=B6ritz?= Date: Fri, 17 Apr 2020 14:07:08 +0200 Subject: [PATCH 02/35] Added the possibility to include a comment when adding hashes to a hash set --- .../AddHashValuesToDatabaseProgressDialog.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java index 3715816801..de6b84bdce 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java @@ -64,7 +64,7 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog { display(parent); this.hashes = new ArrayList<>(); this.invalidHashes = new ArrayList<>(); - this.md5Pattern = Pattern.compile("^[a-fA-F0-9]{32}$"); // NON-NLS + this.md5Pattern = Pattern.compile("^([a-fA-F0-9]{32})"); // NON-NLS this.parentRef = parent; this.hashDb = hashDb; this.text = text; @@ -162,9 +162,15 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog { for (String hashEntry : linesInTextArea) { hashEntry = hashEntry.trim(); Matcher m = md5Pattern.matcher(hashEntry); - if (m.find()) { - // more information can be added to the HashEntry - sha-1, sha-512, comment - hashes.add(new HashEntry(null, m.group(0), null, null, null)); + if (m.find()) { + // Is there any text left on this line? If so, treat it as a comment. + final String comment = hashEntry.substring(m.end()).trim(); + if (comment.length() > 0) { + hashes.add(new HashEntry(null, m.group(0), null, null, comment)); + } else { + // more information can be added to the HashEntry - sha-1, sha-512, comment + hashes.add(new HashEntry(null, m.group(0), null, null, null)); + } } else { if (!hashEntry.isEmpty()) { invalidHashes.add(hashEntry); From a45de89e374f59748ecc90964d5f48018eab398c Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 20 Apr 2020 09:56:32 -0400 Subject: [PATCH 03/35] refactoring of PinnedAccountModel --- .../communications/AbstractCVTAction.java | 5 +- .../autopsy/communications/CVTEvents.java | 21 +++---- .../communications/CommunicationsGraph.java | 56 ++++++++++--------- .../communications/PinnedAccountModel.java | 11 ++-- .../autopsy/communications/StateManager.java | 14 +++-- .../communications/VisualizationPanel.java | 2 +- 6 files changed, 60 insertions(+), 49 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java index ef751d262c..a02f0c0e86 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java @@ -24,6 +24,7 @@ import javax.swing.ImageIcon; import javax.swing.JMenuItem; import org.openide.util.Utilities; import org.openide.util.actions.Presenter; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Base class for actions that act on the selected AccountDeviceInstanceKeys. @@ -37,8 +38,8 @@ abstract class AbstractCVTAction extends AbstractAction implements Presenter.Pop * * @return The selected accounts */ - Collection getSelectedAccounts() { - return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class); + Collection getSelectedAccounts() { + return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstance.class); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java b/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java index ee7224b673..ae3735e30f 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java @@ -24,6 +24,7 @@ import java.util.Collection; import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.autopsy.communications.StateManager.CommunicationsState; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Provide the singleton EventBus. @@ -73,19 +74,19 @@ final class CVTEvents { */ static final class PinAccountsEvent { - private final ImmutableSet accountDeviceInstances; + private final ImmutableSet accounInstances; private final boolean replace; public boolean isReplace() { return replace; } - ImmutableSet getAccountDeviceInstances() { - return accountDeviceInstances; + ImmutableSet getAccountDeviceInstances() { + return accounInstances; } - PinAccountsEvent(Collection accountDeviceInstances, boolean replace) { - this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances); + PinAccountsEvent(Collection accountDeviceInstances, boolean replace) { + this.accounInstances = ImmutableSet.copyOf(accountDeviceInstances); this.replace = replace; } } @@ -95,14 +96,14 @@ final class CVTEvents { */ static final class UnpinAccountsEvent { - private final ImmutableSet accountDeviceInstances; + private final ImmutableSet accountInstances; - public ImmutableSet getAccountDeviceInstances() { - return accountDeviceInstances; + public ImmutableSet getAccountDeviceInstances() { + return accountInstances; } - UnpinAccountsEvent(Collection accountDeviceInstances) { - this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances); + UnpinAccountsEvent(Collection accountDeviceInstances) { + this.accountInstances = ImmutableSet.copyOf(accountDeviceInstances); } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java index 716d00656c..f88edeedcf 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java @@ -32,6 +32,7 @@ import java.io.InputStreamReader; import java.io.StringWriter; import java.net.URL; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -147,7 +148,7 @@ final class CommunicationsGraph extends mxGraph { scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID()); scopes.put("size", Math.round(Math.log(adiKey.getMessageCount()) + 5)); scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType()))); - scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey)); + scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())); scopes.put("MARKER_PIN_URL", MARKER_PIN_URL); scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell)); scopes.put("LOCK_URL", LOCK_URL); @@ -172,7 +173,7 @@ final class CommunicationsGraph extends mxGraph { scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID()); scopes.put("relationships", 12);// Math.round(Math.log(adiKey.getMessageCount()) + 5)); scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType()))); - scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey)); + scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())); scopes.put("MARKER_PIN_URL", MARKER_PIN_URL); scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell)); scopes.put("LOCK_URL", LOCK_URL); @@ -199,16 +200,23 @@ final class CommunicationsGraph extends mxGraph { lockedVertexModel.clear(); } - private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) { - final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance(); + private mxCell getOrCreateVertex(AccountDeviceInstance adi, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + final AccountDeviceInstance accountDeviceInstance = adi; final String name = accountDeviceInstance.getAccount().getTypeSpecificID(); final mxCell vertex = nodeMap.computeIfAbsent(name + accountDeviceInstance.getDeviceId(), vertexName -> { - double size = Math.sqrt(accountDeviceInstanceKey.getMessageCount()) + 10; + long adiRelationshipsCount = 1; + try { + adiRelationshipsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, currentFilter); + } catch (TskCoreException tskCoreException) { + logger.log(Level.SEVERE, "Error", tskCoreException); + } + + double size = Math.sqrt(adiRelationshipsCount) + 10; mxCell newVertex = (mxCell) insertVertex( getDefaultParent(), - name, accountDeviceInstanceKey, + name, adi, Math.random() * 400, Math.random() * 400, size, @@ -219,9 +227,11 @@ final class CommunicationsGraph extends mxGraph { } @SuppressWarnings("unchecked") - private mxCell addOrUpdateEdge(long relSources, AccountDeviceInstanceKey account1, AccountDeviceInstanceKey account2) { - mxCell vertex1 = getOrCreateVertex(account1); - mxCell vertex2 = getOrCreateVertex(account2); + private mxCell addOrUpdateEdge(long relSources, + AccountDeviceInstance account1, AccountDeviceInstance account2, + CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + mxCell vertex1 = getOrCreateVertex(account1, commsManager, currentFilter); + mxCell vertex2 = getOrCreateVertex(account2, commsManager, currentFilter); Object[] edgesBetween = getEdgesBetween(vertex1, vertex2); mxCell edge; if (edgesBetween.length == 0) { @@ -260,28 +270,24 @@ final class CommunicationsGraph extends mxGraph { /** * set to keep track of accounts related to pinned accounts */ - final Map relatedAccounts = new HashMap<>(); - for (final AccountDeviceInstanceKey adiKey : pinnedAccountModel.getPinnedAccounts()) { + final Set relatedAccounts = new HashSet<>(); + for (final AccountDeviceInstance adi : pinnedAccountModel.getPinnedAccounts()) { if (isCancelled()) { break; } //get accounts related to pinned account final List relatedAccountDeviceInstances - = commsManager.getRelatedAccountDeviceInstances(adiKey.getAccountDeviceInstance(), currentFilter); - relatedAccounts.put(adiKey.getAccountDeviceInstance(), adiKey); - getOrCreateVertex(adiKey); + = commsManager.getRelatedAccountDeviceInstances(adi, currentFilter); + relatedAccounts.add(adi); + getOrCreateVertex(adi, commsManager, currentFilter); + + for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) + relatedAccounts.add(relatedADI); - for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) { - final long adiRelationshipsCount = commsManager.getRelationshipSourcesCount(relatedADI, currentFilter); - final AccountDeviceInstanceKey relatedADIKey = new AccountDeviceInstanceKey(relatedADI, currentFilter, adiRelationshipsCount); - relatedAccounts.put(relatedADI, relatedADIKey); //store related accounts - } progressIndicator.progress(++progressCounter); } - Set accounts = relatedAccounts.keySet(); - - Map relationshipCounts = commsManager.getRelationshipCountsPairwise(accounts, currentFilter); + Map relationshipCounts = commsManager.getRelationshipCountsPairwise(relatedAccounts, currentFilter); int total = relationshipCounts.size(); int progress = 0; @@ -290,12 +296,12 @@ final class CommunicationsGraph extends mxGraph { for (Map.Entry entry : relationshipCounts.entrySet()) { Long count = entry.getValue(); AccountPair relationshipKey = entry.getKey(); - AccountDeviceInstanceKey account1 = relatedAccounts.get(relationshipKey.getFirst()); - AccountDeviceInstanceKey account2 = relatedAccounts.get(relationshipKey.getSecond()); + AccountDeviceInstance account1 = relationshipKey.getFirst(); + AccountDeviceInstance account2 = relationshipKey.getSecond(); if (pinnedAccountModel.isAccountPinned(account1) || pinnedAccountModel.isAccountPinned(account2)) { - mxCell addEdge = addOrUpdateEdge(count, account1, account2); + mxCell addEdge = addOrUpdateEdge(count, account1, account2, commsManager, currentFilter); progressText = addEdge.getId(); } progressIndicator.progress(progressText, progress++); diff --git a/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java b/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java index c9fe899c3f..9221a487cb 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import java.util.HashSet; import java.util.Set; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Model of what accounts are pinned to a visualization. @@ -34,7 +35,7 @@ class PinnedAccountModel { * to pinned accounts and pass the filters are show. Pinning accounts is the * primary way to populate the graph. */ - private final Set pinnedAccountDevices = new HashSet<>(); + private final Set pinnedAccountDevices = new HashSet<>(); private final EventBus eventBus = new EventBus(); @@ -46,7 +47,7 @@ class PinnedAccountModel { eventBus.unregister(handler); } - boolean isAccountPinned(AccountDeviceInstanceKey account) { + boolean isAccountPinned(AccountDeviceInstance account) { return pinnedAccountDevices.contains(account); } @@ -57,7 +58,7 @@ class PinnedAccountModel { * * @param accountDeviceInstances The accounts to unpin. */ - void unpinAccount(Set accountDeviceInstances) { + void unpinAccount(Set accountDeviceInstances) { pinnedAccountDevices.removeAll(accountDeviceInstances); } @@ -68,7 +69,7 @@ class PinnedAccountModel { * * @param accountDeviceInstances The accounts to pin. */ - void pinAccount(Set accountDeviceInstances) { + void pinAccount(Set accountDeviceInstances) { pinnedAccountDevices.addAll(accountDeviceInstances); } @@ -86,7 +87,7 @@ class PinnedAccountModel { pinnedAccountDevices.clear(); } - ImmutableSet getPinnedAccounts() { + ImmutableSet getPinnedAccounts() { return ImmutableSet.copyOf(pinnedAccountDevices); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java index c84a5beb79..ca1d902153 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java +++ b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java @@ -23,6 +23,8 @@ import java.util.HashSet; import java.util.Set; import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState; import org.sleuthkit.autopsy.coreutils.History; +import org.sleuthkit.datamodel.Account; +import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; /** @@ -51,11 +53,11 @@ final class StateManager { @Subscribe void pinAccount(CVTEvents.PinAccountsEvent pinEvent) { if(pinEvent.isReplace()){ - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinEvent.getAccountDeviceInstances()); historyManager.advance(new CommunicationsState(comFilter, pinnedList, -1, currentStartState, currentEndState)); } else { - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinEvent.getAccountDeviceInstances()); pinnedList.addAll(pinModel.getPinnedAccounts()); @@ -74,7 +76,7 @@ final class StateManager { @Subscribe void unpinAccounts(CVTEvents.UnpinAccountsEvent pinEvent) { - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinModel.getPinnedAccounts()); pinnedList.removeAll(pinEvent.getAccountDeviceInstances()); @@ -135,7 +137,7 @@ final class StateManager { */ final class CommunicationsState{ private final CommunicationsFilter communcationFilter; - private final Set pinnedList; + private final Set pinnedList; private final double zoomValue; private final DateControlState startDateState; private final DateControlState endDateState; @@ -149,7 +151,7 @@ final class StateManager { * @param zoomValue Double value of the current graph scale */ protected CommunicationsState(CommunicationsFilter communcationFilter, - Set pinnedList, double zoomValue, + Set pinnedList, double zoomValue, DateControlState startDateState, DateControlState endDateState){ this.pinnedList = pinnedList; this.communcationFilter = communcationFilter; @@ -172,7 +174,7 @@ final class StateManager { * * @return Set of AccountDeviceInstanceKey */ - public Set getPinnedList(){ + public Set getPinnedList(){ return pinnedList; } diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 1799ebcb8d..51005878ec 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -1100,7 +1100,7 @@ final public class VisualizationPanel extends JPanel { } else { jPopupMenu.add(new JMenuItem(new LockAction(selectedVertices))); } - if (pinnedAccountModel.isAccountPinned(adiKey)) { + if (pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())) { jPopupMenu.add(UnpinAccountsAction.getInstance().getPopupPresenter()); } else { jPopupMenu.add(PinAccountsAction.getInstance().getPopupPresenter()); From 1f3acd3647928983aa48bfb50d042746dd74f380 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 20 Apr 2020 10:22:49 -0400 Subject: [PATCH 04/35] some bug fixes --- .../sleuthkit/autopsy/communications/AbstractCVTAction.java | 6 +++++- .../autopsy/communications/CommunicationsGraph.java | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java index a02f0c0e86..95c2d43bbb 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.communications; import java.util.Collection; +import java.util.stream.Collectors; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JMenuItem; @@ -39,7 +40,10 @@ abstract class AbstractCVTAction extends AbstractAction implements Presenter.Pop * @return The selected accounts */ Collection getSelectedAccounts() { - return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstance.class); + return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class) + .stream() + .map((adiKey -> adiKey.getAccountDeviceInstance())) + .collect(Collectors.toSet()); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java index f88edeedcf..38a20d07e5 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java @@ -213,10 +213,11 @@ final class CommunicationsGraph extends mxGraph { } double size = Math.sqrt(adiRelationshipsCount) + 10; - + AccountDeviceInstanceKey adiKey = new AccountDeviceInstanceKey(adi, currentFilter, adiRelationshipsCount); + mxCell newVertex = (mxCell) insertVertex( getDefaultParent(), - name, adi, + name, adiKey, Math.random() * 400, Math.random() * 400, size, From 09f46d2b1c5638fea1235f53efd01652cbe76c5f Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 20 Apr 2020 11:01:01 -0400 Subject: [PATCH 05/35] remove unused import --- Core/src/org/sleuthkit/autopsy/communications/StateManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java index ca1d902153..3f24a98764 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java +++ b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java @@ -23,7 +23,6 @@ import java.util.HashSet; import java.util.Set; import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState; import org.sleuthkit.autopsy.coreutils.History; -import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; From 47ac6d5a104255731c0c5287c2784365d633db8c Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Mon, 20 Apr 2020 17:06:18 -0400 Subject: [PATCH 06/35] 6267 Preventing datasources with no geodata from appearing in the geolocation panel, also fixing artifact type counts --- .../autopsy/geolocation/GeoFilterPanel.java | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index f9d8fca38e..c78c822af0 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -23,6 +23,8 @@ import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -35,12 +37,13 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.SpinnerNumberModel; import javax.swing.SwingWorker; +import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.utils.IconsUtil; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; +import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -482,6 +485,50 @@ class GeoFilterPanel extends javax.swing.JPanel { return new Sources(validSources, atCountsTotal); } + /** + * Get a count of TSK_METADATA_EXIF artifacts containing GPS data for + * the given data case and source. Does not include rejected artifacts. + * + * @param sleuthkitCase + * @param dataSourceID + * + * @return The artifacts count that match the criteria + * + * @throws TskCoreException + */ + public long getExifGPSDataCount(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException { + long count = 0; + String queryStr + = "SELECT count(*) AS count FROM" + + " (" + + " SELECT artifact_obj_id, group_concat(attribute_type_id) FROM" + + " (" + + " SELECT * FROM blackboard_artifacts as arts" + + " INNER JOIN blackboard_attributes as attrs" + + " ON attrs.artifact_id = arts.artifact_id" + + " WHERE arts.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() + + " AND arts.data_source_obj_id = " + dataSource.getId() + + " AND arts.review_status_id != " + BlackboardArtifact.ReviewStatus.REJECTED.getID() + + " AND" + + " (" + + "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID() + + " )" + + " )" + + "GROUP BY artifact_obj_id" + + " )"; + try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr)) { + ResultSet resultSet = queryResult.getResultSet(); + try { + resultSet.next(); + count = resultSet.getLong("count"); + } catch (SQLException ex) { + Exceptions.printStackTrace(ex); + } + } + return count; + } + /** * Returns a Map representing the number of sources found for each * artifact type. If no data was found, an empty map is returned. @@ -496,7 +543,12 @@ class GeoFilterPanel extends javax.swing.JPanel { private Map getGPSDataSources(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException { HashMap ret = new HashMap<>(); for (BlackboardArtifact.ARTIFACT_TYPE type : GPS_ARTIFACT_TYPES) { - long count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId()); + long count; + if (type == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF) { + count = getExifGPSDataCount(sleuthkitCase, dataSource); + } else { + count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId()); + } if (count > 0) { ret.put(type, count); } From dbaaa7efaeec9eec076537b5116bb8d4c3a56c68 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 20 Apr 2020 20:04:34 -0400 Subject: [PATCH 07/35] First pass of TagSEt support --- .../casemodule/services/Bundle.properties | 0 .../services/Bundle.properties-MERGED | 6 ++ .../services/TagNameDefinition.java | 98 ++++++++++++------- .../casemodule/services/TagNameDialog.java | 2 +- .../casemodule/services/TagOptionsPanel.java | 2 - .../casemodule/services/TagsManager.java | 61 +++++++++--- .../datamodel/DrawableTagsManager.java | 2 +- 7 files changed, 114 insertions(+), 57 deletions(-) mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java mode change 100644 => 100755 Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED index 5e79318334..8fa5d9888b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED @@ -1,3 +1,9 @@ +Category.five=CAT-5: Non-pertinent +Category.four=CAT-4: Exemplar/Comparison (Internal Use Only) +Category.one=CAT-1: Child Exploitation (Illegal) +Category.three=CAT-3: CGI/Animation (Child Exploitive) +Category.two=CAT-2: Child Exploitation (Non-Illegal/Age Difficult) +Category.zero=CAT-0: Uncategorized OptionsCategory_Name_TagNamesOptions=Tags OptionsCategory_TagNames=TagNames TagNameDefinition.predefTagNames.bookmark.text=Bookmark diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java old mode 100644 new mode 100755 index 33e8f29237..b86735a565 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -20,8 +20,11 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.logging.Level; @@ -32,7 +35,6 @@ import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.autopsy.datamodel.DhsImageCategory; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -46,20 +48,43 @@ final class TagNameDefinition implements Comparable { private static final Logger LOGGER = Logger.getLogger(TagNameDefinition.class.getName()); @NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark", "TagNameDefinition.predefTagNames.followUp.text=Follow Up", - "TagNameDefinition.predefTagNames.notableItem.text=Notable Item"}) - private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS - private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS + "TagNameDefinition.predefTagNames.notableItem.text=Notable Item", + "Category.one=CAT-1: Child Exploitation (Illegal)", + "Category.two=CAT-2: Child Exploitation (Non-Illegal/Age Difficult)", + "Category.three=CAT-3: CGI/Animation (Child Exploitive)", + "Category.four=CAT-4: Exemplar/Comparison (Internal Use Only)", + "Category.five=CAT-5: Non-pertinent", + "Category.zero=CAT-0: Uncategorized"}) + + private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS + private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS + private static final String TAG_NAMES_SETTING_VERSION_KEY = "CustomTagNameVersion"; + private static final String TAG_SETTINGS_NAME_VERSION = "1"; - private static final List STANDARD_NOTABLE_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName()); // NON-NLS - private static final List STANDARD_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), Bundle.TagNameDefinition_predefTagNames_followUp_text(), - Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), - DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName(), - DhsImageCategory.FOUR.getDisplayName(), DhsImageCategory.FIVE.getDisplayName(), DhsImageCategory.ZERO.getDisplayName()); private final String displayName; private final String description; private final TagName.HTML_COLOR color; private final TskData.FileKnown knownStatus; + static final Map STANDARD_TAGS = new HashMap<>(); + static final Map PROJECT_VIC_DEFAULT_TAGS = new HashMap<>(); + private static final List STANDARD_TAG_NAMES = new ArrayList<>(); + + static { + STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); + + PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_one(), new TagNameDefinition(Bundle.Category_one(), "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); + PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_two(), new TagNameDefinition(Bundle.Category_two(), "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); + PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_three(), new TagNameDefinition(Bundle.Category_three(), "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); + PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_four(), new TagNameDefinition(Bundle.Category_four(), "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_five(), new TagNameDefinition(Bundle.Category_five(), "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); + + STANDARD_TAG_NAMES.addAll(STANDARD_TAGS.keySet()); + STANDARD_TAG_NAMES.addAll(PROJECT_VIC_DEFAULT_TAGS.keySet()); + } + /** * Constructs a tag name definition consisting of a display name, * description, color and knownStatus. @@ -77,7 +102,7 @@ final class TagNameDefinition implements Comparable { } static List getStandardTagNames() { - return STANDARD_TAG_DISPLAY_NAMES; + return Collections.unmodifiableList(STANDARD_TAG_NAMES); } /** @@ -199,7 +224,6 @@ final class TagNameDefinition implements Comparable { static synchronized Set getTagNameDefinitions() { Set tagNames = new LinkedHashSet<>(); //modifiable copy of default tags list for us to keep track of which default tags have already been created - Set standardTags = new LinkedHashSet<>(STANDARD_TAG_DISPLAY_NAMES); String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); if (null != setting && !setting.isEmpty()) { List tagNameTuples = Arrays.asList(setting.split(";")); @@ -210,18 +234,11 @@ final class TagNameDefinition implements Comparable { } if (numberOfAttributes == 3) { // Upgrade Tags.Properties with the settings in Central Repository Settings if necessary - tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples, standardTags)); + tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples)); } else if (numberOfAttributes == 4) { // if the Tags.Properties file is up to date parse it - tagNames.addAll(readCurrentTagPropertiesFile(tagNameTuples, standardTags)); - } - } - //create standard tags which should always exist which were not already created for whatever reason, such as upgrade - for (String standardTagName : standardTags) { - if (STANDARD_NOTABLE_TAG_DISPLAY_NAMES.contains(standardTagName)) { - tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); - } else { - tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + Set tagNameDefinitions = readCurrentTagPropertiesFile(tagNameTuples); + tagNames.addAll(tagNameDefinitions); } } return tagNames; @@ -239,24 +256,24 @@ final class TagNameDefinition implements Comparable { * * @return tagNames a list of TagNameDefinitions */ - private static Set upgradeTagPropertiesFile(List tagProperties, Set standardTagsToBeCreated) { + private static Set upgradeTagPropertiesFile(List tagProperties) { Set tagNames = new LinkedHashSet<>(); List legacyNotableTags = new ArrayList<>(); String badTagsStr = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS - if (badTagsStr == null || badTagsStr.isEmpty()) { //if there were no bad tags in the central repo properties file use the default list - legacyNotableTags.addAll(STANDARD_NOTABLE_TAG_DISPLAY_NAMES); - } else { //otherwise use the list that was in the central repository properties file + if (badTagsStr != null && !badTagsStr.isEmpty()) { legacyNotableTags.addAll(Arrays.asList(badTagsStr.split(","))); } + for (String tagNameTuple : tagProperties) { String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created - if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD)); - } else { //otherwise create it as unknown - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag + if (!(STANDARD_TAGS.containsKey(tagNameAttributes[0]) || PROJECT_VIC_DEFAULT_TAGS.containsKey(tagNameAttributes[0]))) { + if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such + tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], + TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD)); + } else { //otherwise create it as unknown + tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], + TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag + } } } return tagNames; @@ -264,22 +281,25 @@ final class TagNameDefinition implements Comparable { /** * Read the Tags.properties file to get the TagNameDefinitions that are - * preserved accross cases. + * preserved across cases. * - * @param tagProperties the list of comma seperated tags in the + * @param tagProperties the list of comma separated tags in the * Tags.properties file * @param standardTagsToBeCreated the list of standard tags which have yet * to be created * * @return tagNames a list of TagNameDefinitions */ - private static Set readCurrentTagPropertiesFile(List tagProperties, Set standardTagsToBeCreated) { + private static Set readCurrentTagPropertiesFile(List tagProperties) { Set tagNames = new LinkedHashSet<>(); + String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTINGS_NAME_VERSION); for (String tagNameTuple : tagProperties) { String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); + // Remove the standard and project vic tags from this list. + if (version != null || !(STANDARD_TAGS.containsKey(tagNameAttributes[0]) || PROJECT_VIC_DEFAULT_TAGS.containsKey(tagNameAttributes[0]))) { + tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], + TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); + } } return tagNames; } @@ -303,6 +323,8 @@ final class TagNameDefinition implements Comparable { LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); } } + + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_VERSION_KEY, TAG_SETTINGS_NAME_VERSION); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString()); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java old mode 100644 new mode 100755 index 79207aaaaa..5b2bb75da5 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java @@ -140,7 +140,7 @@ final class TagNameDialog extends javax.swing.JDialog { return; } //if a tag name contains illegal characters and is not the name of one of the standard tags - if (TagsManager.containsIllegalCharacters(newTagDisplayName) && !TagNameDefinition.getStandardTagNames().contains(newTagDisplayName)) { + if (TagsManager.containsIllegalCharacters(newTagDisplayName)) { JOptionPane.showMessageDialog(this, NbBundle.getMessage(TagNameDialog.class, "TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.message"), NbBundle.getMessage(TagNameDialog.class, "TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.title"), diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java old mode 100644 new mode 100755 index 4b3aba82a7..0e5ebeb4ea --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java @@ -446,8 +446,6 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel { boolean isSelected = tagNamesList.getSelectedIndex() != -1; boolean enableEdit = !ingestIsRunning && isSelected; editTagNameButton.setEnabled(enableEdit); - boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName()); - deleteTagNameButton.setEnabled(enableDelete); if (isSelected) { descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription()); if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java old mode 100644 new mode 100755 index 80374dad75..e1487aeda0 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -41,6 +41,7 @@ import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TagSet; +import org.sleuthkit.datamodel.TaggingManager; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskData.DbType; @@ -53,9 +54,10 @@ public class TagsManager implements Closeable { private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName()); private final SleuthkitCase caseDb; - + static { - //Create the contentviewer tags table (beta) if the current case does not + + //Create the contentviewer tags table if the current case does not //have the table present Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> { if (evt.getNewValue() != null) { @@ -65,7 +67,7 @@ public class TagsManager implements Closeable { if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) { return; } - + if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) { caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_SQLITE); } else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) { @@ -169,6 +171,28 @@ public class TagsManager implements Closeable { */ TagsManager(SleuthkitCase caseDb) { this.caseDb = caseDb; + + // Add standard tags and the Project VIC default tag set and tags. + TaggingManager taggingMgr = caseDb.getTagsManager(); + try { + List setList = taggingMgr.getTagSets(); + if (setList.isEmpty()) { + //Assume new case and add Project VIC tags. + TagSet set = taggingMgr.addTagSet("Project VIC (United States)"); + + for (TagNameDefinition def : TagNameDefinition.PROJECT_VIC_DEFAULT_TAGS.values()) { + TagName tagName = caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); + taggingMgr.addTagNameToTagSet(set, tagName); + } + + for (TagNameDefinition def : TagNameDefinition.STANDARD_TAGS.values()) { + caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); + } + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Error updating non-file object ", ex); + } + for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) { tagName.saveToCase(caseDb); } @@ -243,7 +267,8 @@ public class TagsManager implements Closeable { /** * Selects all of the rows from the tag_names table in the case database for * which there is at least one matching row in the content_tags or - * blackboard_artifact_tags tables, for the given data source object id and user. + * blackboard_artifact_tags tables, for the given data source object id and + * user. * * @param dsObjId data source object id * @param userName - the user name that you want to get tags for @@ -269,10 +294,6 @@ public class TagsManager implements Closeable { } return new ArrayList<>(tagNameSet); } - - public List getTagSets() { - return null; - } /** * Gets a map of tag display names to tag name entries in the case database. @@ -454,14 +475,19 @@ public class TagsManager implements Closeable { * database. */ public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException { - ContentTag tag; - tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); + TaggingManager.ContentTagChange tagChange = caseDb.getTagsManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); try { - Case.getCurrentCaseThrows().notifyContentTagAdded(tag); + Case currentCase = Case.getCurrentCaseThrows(); + + for (ContentTag tag : tagChange.getRemovedTags()) { + currentCase.notifyContentTagDeleted(tag); + } + + currentCase.notifyContentTagAdded(tagChange.getAddedTag()); } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } - return tag; + return tagChange.getAddedTag(); } /** @@ -673,13 +699,18 @@ public class TagsManager implements Closeable { * database. */ public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException { - BlackboardArtifactTag tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment); + TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTagsManager().addArtifactTag(artifact, tagName, comment); try { - Case.getCurrentCaseThrows().notifyBlackBoardArtifactTagAdded(tag); + Case currentCase = Case.getCurrentCaseThrows(); + + for (BlackboardArtifactTag tag : tagChange.getRemovedTags()) { + currentCase.notifyBlackBoardArtifactTagDeleted(tag); + } + currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag()); } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } - return tag; + return tagChange.getAddedTag(); } /** diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java index 3a9ae712b8..d2cdc484ce 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java @@ -190,7 +190,7 @@ public final class DrawableTagsManager { returnTagName = autopsyTagsManager.getDisplayNamesToTagNamesMap().get(displayName); if (returnTagName != null) { return returnTagName; - } + } throw new TskCoreException("Tag name exists but an error occured in retrieving it", ex); } } From ca23c913e170813d6024b8fde93ae1fdec43951d Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 21 Apr 2020 15:21:54 -0400 Subject: [PATCH 08/35] codacy and code review updates --- .../services/TagNameDefinition.java | 170 ++++++++++-------- .../casemodule/services/TagsManager.java | 10 +- 2 files changed, 101 insertions(+), 79 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index b86735a565..c943205c3d 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -20,8 +20,10 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -58,31 +60,27 @@ final class TagNameDefinition implements Comparable { private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS - private static final String TAG_NAMES_SETTING_VERSION_KEY = "CustomTagNameVersion"; - private static final String TAG_SETTINGS_NAME_VERSION = "1"; + private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion"; + private static final String TAG_SETTINGS_VERSION = "1"; private final String displayName; private final String description; private final TagName.HTML_COLOR color; private final TskData.FileKnown knownStatus; - static final Map STANDARD_TAGS = new HashMap<>(); - static final Map PROJECT_VIC_DEFAULT_TAGS = new HashMap<>(); - private static final List STANDARD_TAG_NAMES = new ArrayList<>(); + private static final Map STANDARD_TAGS_DEFINITIONS = new HashMap<>(); + private static final Map PROJECT_VIC_TAG_DEFINITIONS = new HashMap<>(); static { - STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); - STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); - STANDARD_TAGS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); - PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_one(), new TagNameDefinition(Bundle.Category_one(), "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); - PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_two(), new TagNameDefinition(Bundle.Category_two(), "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); - PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_three(), new TagNameDefinition(Bundle.Category_three(), "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); - PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_four(), new TagNameDefinition(Bundle.Category_four(), "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); - PROJECT_VIC_DEFAULT_TAGS.put(Bundle.Category_five(), new TagNameDefinition(Bundle.Category_five(), "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); - - STANDARD_TAG_NAMES.addAll(STANDARD_TAGS.keySet()); - STANDARD_TAG_NAMES.addAll(PROJECT_VIC_DEFAULT_TAGS.keySet()); + PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_one(), new TagNameDefinition(Bundle.Category_one(), "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_two(), new TagNameDefinition(Bundle.Category_two(), "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_three(), new TagNameDefinition(Bundle.Category_three(), "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_four(), new TagNameDefinition(Bundle.Category_four(), "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_five(), new TagNameDefinition(Bundle.Category_five(), "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); } /** @@ -100,9 +98,21 @@ final class TagNameDefinition implements Comparable { this.color = color; this.knownStatus = status; } + + static Collection getStandardTagNameDefinitions() { + return STANDARD_TAGS_DEFINITIONS.values(); + } + + static Collection getProjectVICDefaultDefinitions() { + return PROJECT_VIC_TAG_DEFINITIONS.values(); + } static List getStandardTagNames() { - return Collections.unmodifiableList(STANDARD_TAG_NAMES); + List strList = new ArrayList<>(); + strList.addAll(STANDARD_TAGS_DEFINITIONS.keySet()); + strList.addAll(PROJECT_VIC_TAG_DEFINITIONS.keySet()); + + return strList; } /** @@ -218,90 +228,102 @@ final class TagNameDefinition implements Comparable { /** * Gets tag name definitions from the tag settings file as well as the * default tag name definitions. + * + * The currently custom tags properties are stored in one string property value + * separated by ;. The properties of an individual tag are comma separated + * in the format of: + * tag_name,tag_description,tag_color,known_status + * + * In prior versions of autopsy the known_status was stored in the central repository, + * therefore the properties file only had three values. * * @return A set of tag name definition objects. */ static synchronized Set getTagNameDefinitions() { Set tagNames = new LinkedHashSet<>(); - //modifiable copy of default tags list for us to keep track of which default tags have already been created - String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); - if (null != setting && !setting.isEmpty()) { - List tagNameTuples = Arrays.asList(setting.split(";")); + String customTagsList = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); + if (null != customTagsList && !customTagsList.isEmpty()) { + List customTagDefinitions = Arrays.asList(customTagsList.split(";")); int numberOfAttributes = 0; - if (tagNameTuples.size() > 0) { - // Determine if Tags.properties file needs to be upgraded - numberOfAttributes = tagNameTuples.get(0).split(",").length; + List tagDefinitions = new ArrayList<>(); + if (!customTagDefinitions.isEmpty()) { + // Use the first entry in the list to figure out if there are 3 + // or four tag attributes in the file. + numberOfAttributes = customTagDefinitions.get(0).split(",").length; } if (numberOfAttributes == 3) { - // Upgrade Tags.Properties with the settings in Central Repository Settings if necessary - tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples)); + // Get the known status from the Central Repository + String crTagKnownProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS + List knownTagNameList = new ArrayList<>(); + if(crTagKnownProp != null && !crTagKnownProp.isEmpty()) { + knownTagNameList.addAll(Arrays.asList(crTagKnownProp.split(","))); + } + + tagDefinitions = buildTagNameDefinitions(customTagDefinitions, knownTagNameList); } else if (numberOfAttributes == 4) { - // if the Tags.Properties file is up to date parse it - Set tagNameDefinitions = readCurrentTagPropertiesFile(tagNameTuples); - tagNames.addAll(tagNameDefinitions); + tagDefinitions = buildTagNameDefinitions(customTagDefinitions); } - } - return tagNames; - - } - - /** - * Read the central repository properties file to get any knownStatus - * related tag settings that may exist in it. - * - * @param tagProperties the list of comma seperated tags in the - * Tags.properties file - * @param standardTagsToBeCreated the list of standard tags which have yet - * to be created - * - * @return tagNames a list of TagNameDefinitions - */ - private static Set upgradeTagPropertiesFile(List tagProperties) { - Set tagNames = new LinkedHashSet<>(); - List legacyNotableTags = new ArrayList<>(); - String badTagsStr = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS - if (badTagsStr != null && !badTagsStr.isEmpty()) { - legacyNotableTags.addAll(Arrays.asList(badTagsStr.split(","))); - } - - for (String tagNameTuple : tagProperties) { - String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - if (!(STANDARD_TAGS.containsKey(tagNameAttributes[0]) || PROJECT_VIC_DEFAULT_TAGS.containsKey(tagNameAttributes[0]))) { - if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD)); - } else { //otherwise create it as unknown - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag + + // Remove the standard and project vic tags. + List standardTagNames = getStandardTagNames(); + for(TagNameDefinition def: tagDefinitions) { + if(!standardTagNames.contains(def.getDisplayName())) { + tagNames.add(def); } } } return tagNames; } + /** + * Returns a list of TagNameDefinitons created by merging the tag data + * from the properties file and the known status information from the central + * repository. + * + * @param tagProperties List of description strings. + * @param centralRepoNotableTags List of known tag names. + * + * @return A list of TagNameDefinitions. + */ + private static List buildTagNameDefinitions(List tagProperties, List centralRepoNotableTags) { + List tagNameDefinitions = new ArrayList<>(); + + for (String propertyString : tagProperties) { + // Split the property into attributes + String[] attributes = propertyString.split(","); //get the attributes + String tagName = attributes[0]; + TskData.FileKnown knownStatus = TskData.FileKnown.UNKNOWN; + + if(centralRepoNotableTags.contains(tagName)) { + knownStatus = TskData.FileKnown.BAD; + } + + tagNameDefinitions.add(new TagNameDefinition(tagName, attributes[1], + TagName.HTML_COLOR.valueOf(attributes[2]), knownStatus)); + } + + return tagNameDefinitions; + } + /** * Read the Tags.properties file to get the TagNameDefinitions that are * preserved across cases. * - * @param tagProperties the list of comma separated tags in the - * Tags.properties file + * @param tagProperties List of description strings. + * * @param standardTagsToBeCreated the list of standard tags which have yet * to be created * * @return tagNames a list of TagNameDefinitions */ - private static Set readCurrentTagPropertiesFile(List tagProperties) { - Set tagNames = new LinkedHashSet<>(); - String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTINGS_NAME_VERSION); + private static List buildTagNameDefinitions(List tagProperties) { + List tagNameDefinitions = new ArrayList<>(); for (String tagNameTuple : tagProperties) { String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - // Remove the standard and project vic tags from this list. - if (version != null || !(STANDARD_TAGS.containsKey(tagNameAttributes[0]) || PROJECT_VIC_DEFAULT_TAGS.containsKey(tagNameAttributes[0]))) { - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); - } + tagNameDefinitions.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], + TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); } - return tagNames; + return tagNameDefinitions; } /** @@ -324,7 +346,7 @@ final class TagNameDefinition implements Comparable { } } - ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_VERSION_KEY, TAG_SETTINGS_NAME_VERSION); + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, TAG_SETTINGS_VERSION); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString()); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index e1487aeda0..786c76ec7b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -173,19 +173,19 @@ public class TagsManager implements Closeable { this.caseDb = caseDb; // Add standard tags and the Project VIC default tag set and tags. - TaggingManager taggingMgr = caseDb.getTagsManager(); + TaggingManager taggingMgr = caseDb.getTaggingManager(); try { List setList = taggingMgr.getTagSets(); if (setList.isEmpty()) { //Assume new case and add Project VIC tags. TagSet set = taggingMgr.addTagSet("Project VIC (United States)"); - for (TagNameDefinition def : TagNameDefinition.PROJECT_VIC_DEFAULT_TAGS.values()) { + for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) { TagName tagName = caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); taggingMgr.addTagNameToTagSet(set, tagName); } - for (TagNameDefinition def : TagNameDefinition.STANDARD_TAGS.values()) { + for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) { caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); } } @@ -475,7 +475,7 @@ public class TagsManager implements Closeable { * database. */ public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException { - TaggingManager.ContentTagChange tagChange = caseDb.getTagsManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); + TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); try { Case currentCase = Case.getCurrentCaseThrows(); @@ -699,7 +699,7 @@ public class TagsManager implements Closeable { * database. */ public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException { - TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTagsManager().addArtifactTag(artifact, tagName, comment); + TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment); try { Case currentCase = Case.getCurrentCaseThrows(); From c06db98b0fc398c48f928b91e5bc5c8092af16bf Mon Sep 17 00:00:00 2001 From: esaunders Date: Tue, 21 Apr 2020 15:58:30 -0400 Subject: [PATCH 09/35] Removed reference to brew since the formula is out of date and does not work. --- Running_Linux_OSX.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Running_Linux_OSX.txt b/Running_Linux_OSX.txt index 60b81bc50a..0427c003b4 100644 --- a/Running_Linux_OSX.txt +++ b/Running_Linux_OSX.txt @@ -42,11 +42,10 @@ The following need to be done at least once. They do not need to be repeated for Autopsy depends on a specific version of The Sleuth Kit. You need the Java libraries of The Sleuth Kit installed, which is not part of all packages. -- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. --- % sudo apt install ./sleuthkit-java_4.7.0-1_amd64.deb +- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. For example: +-- % sudo apt install ./sleuthkit-java_4.8.0-1_amd64.deb -- OS X: Install The Sleuth Kit from brew. --- % brew install sleuthkit +- OS X: Build The Sleuth Kit from source. See https://github.com/sleuthkit/sleuthkit/blob/develop/INSTALL.txt for details. * Install Autopsy * From 8409bee5b0fd95bb2646529bab5e47f30ea5520a Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 21 Apr 2020 16:13:07 -0400 Subject: [PATCH 10/35] Removed unused imports --- .../autopsy/casemodule/services/TagNameDefinition.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index c943205c3d..750bfbdb00 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -21,9 +21,7 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; From 98151b1de8791fe3aeb64981a2aa035087fcbb19 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 21 Apr 2020 17:13:35 -0400 Subject: [PATCH 11/35] Updated format in TagNameDefinition --- .../services/TagNameDefinition.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index 750bfbdb00..c3e800b61f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -96,11 +96,11 @@ final class TagNameDefinition implements Comparable { this.color = color; this.knownStatus = status; } - + static Collection getStandardTagNameDefinitions() { return STANDARD_TAGS_DEFINITIONS.values(); } - + static Collection getProjectVICDefaultDefinitions() { return PROJECT_VIC_TAG_DEFINITIONS.values(); } @@ -109,7 +109,7 @@ final class TagNameDefinition implements Comparable { List strList = new ArrayList<>(); strList.addAll(STANDARD_TAGS_DEFINITIONS.keySet()); strList.addAll(PROJECT_VIC_TAG_DEFINITIONS.keySet()); - + return strList; } @@ -226,14 +226,14 @@ final class TagNameDefinition implements Comparable { /** * Gets tag name definitions from the tag settings file as well as the * default tag name definitions. - * - * The currently custom tags properties are stored in one string property value - * separated by ;. The properties of an individual tag are comma separated - * in the format of: + * + * The currently custom tags properties are stored in one string property + * value separated by ;. The properties of an individual tag are comma + * separated in the format of: * tag_name,tag_description,tag_color,known_status - * - * In prior versions of autopsy the known_status was stored in the central repository, - * therefore the properties file only had three values. + * + * In prior versions of autopsy the known_status was stored in the central + * repository, therefore the properties file only had three values. * * @return A set of tag name definition objects. */ @@ -253,19 +253,19 @@ final class TagNameDefinition implements Comparable { // Get the known status from the Central Repository String crTagKnownProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS List knownTagNameList = new ArrayList<>(); - if(crTagKnownProp != null && !crTagKnownProp.isEmpty()) { + if (crTagKnownProp != null && !crTagKnownProp.isEmpty()) { knownTagNameList.addAll(Arrays.asList(crTagKnownProp.split(","))); } - + tagDefinitions = buildTagNameDefinitions(customTagDefinitions, knownTagNameList); } else if (numberOfAttributes == 4) { tagDefinitions = buildTagNameDefinitions(customTagDefinitions); } - + // Remove the standard and project vic tags. List standardTagNames = getStandardTagNames(); - for(TagNameDefinition def: tagDefinitions) { - if(!standardTagNames.contains(def.getDisplayName())) { + for (TagNameDefinition def : tagDefinitions) { + if (!standardTagNames.contains(def.getDisplayName())) { tagNames.add(def); } } @@ -274,32 +274,32 @@ final class TagNameDefinition implements Comparable { } /** - * Returns a list of TagNameDefinitons created by merging the tag data - * from the properties file and the known status information from the central + * Returns a list of TagNameDefinitons created by merging the tag data from + * the properties file and the known status information from the central * repository. - * - * @param tagProperties List of description strings. - * @param centralRepoNotableTags List of known tag names. - * + * + * @param tagProperties List of description strings. + * @param centralRepoNotableTags List of known tag names. + * * @return A list of TagNameDefinitions. */ private static List buildTagNameDefinitions(List tagProperties, List centralRepoNotableTags) { List tagNameDefinitions = new ArrayList<>(); - + for (String propertyString : tagProperties) { // Split the property into attributes String[] attributes = propertyString.split(","); //get the attributes String tagName = attributes[0]; TskData.FileKnown knownStatus = TskData.FileKnown.UNKNOWN; - - if(centralRepoNotableTags.contains(tagName)) { + + if (centralRepoNotableTags.contains(tagName)) { knownStatus = TskData.FileKnown.BAD; } - + tagNameDefinitions.add(new TagNameDefinition(tagName, attributes[1], - TagName.HTML_COLOR.valueOf(attributes[2]), knownStatus)); + TagName.HTML_COLOR.valueOf(attributes[2]), knownStatus)); } - + return tagNameDefinitions; } @@ -308,14 +308,14 @@ final class TagNameDefinition implements Comparable { * preserved across cases. * * @param tagProperties List of description strings. - * + * * @param standardTagsToBeCreated the list of standard tags which have yet * to be created * * @return tagNames a list of TagNameDefinitions */ private static List buildTagNameDefinitions(List tagProperties) { - List tagNameDefinitions = new ArrayList<>(); + List tagNameDefinitions = new ArrayList<>(); for (String tagNameTuple : tagProperties) { String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes tagNameDefinitions.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], From 4317a3ae27351feb74bcb0a23b6bd9862afaf316 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Tue, 21 Apr 2020 22:50:51 -0400 Subject: [PATCH 12/35] 6285 Better selection range for dots on geo map --- .../autopsy/geolocation/MapPanel.java | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java index 44de21ff81..eea578b0c0 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -83,9 +84,13 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; final public class MapPanel extends javax.swing.JPanel { static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION"; + private static final Logger logger = Logger.getLogger(MapPanel.class.getName()); private static final long serialVersionUID = 1L; + private static final HashSet DOT_WAYPOINT_TYPES = new HashSet<>(); + private static final int DOT_SIZE = 12; + private boolean zoomChanging; private KdTree waypointTree; private Set waypointSet; @@ -104,6 +109,12 @@ final public class MapPanel extends javax.swing.JPanel { private MapWaypoint currentlySelectedWaypoint; private Set currentlySelectedTrack; + static { + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()); + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID()); + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()); + } + /** * Creates new form MapPanel */ @@ -486,14 +497,30 @@ final public class MapPanel extends javax.swing.JPanel { Iterator iterator = waypoints.iterator(); - // These maybe the points closest to lat/log was clicked but - // that doesn't mean they are close in terms of pixles. + // These may be the points closest to the lat/lon location that was + // clicked, but that doesn't mean they are close in terms of pixles. List closestPoints = new ArrayList<>(); while (iterator.hasNext()) { MapWaypoint nextWaypoint = iterator.next(); - Point2D point = mapViewer.convertGeoPositionToPoint(nextWaypoint.getPosition()); - Rectangle rect = new Rectangle((int) point.getX() - (whiteWaypointImage.getWidth() / 2), (int) point.getY() - whiteWaypointImage.getHeight(), whiteWaypointImage.getWidth(), whiteWaypointImage.getHeight()); + int pointX = (int) point.getX(); + int pointY = (int) point.getY(); + Rectangle rect; + if (DOT_WAYPOINT_TYPES.contains(nextWaypoint.getArtifactTypeID())) { + rect = new Rectangle( + pointX - (DOT_SIZE / 2), + pointY - (DOT_SIZE / 2), + DOT_SIZE, + DOT_SIZE + ); + } else { + rect = new Rectangle( + pointX - (whiteWaypointImage.getWidth() / 2), + pointY - whiteWaypointImage.getHeight(), + whiteWaypointImage.getWidth(), + whiteWaypointImage.getHeight() + ); + } if (rect.contains(clickPoint)) { closestPoints.add(nextWaypoint); @@ -689,6 +716,7 @@ final public class MapPanel extends javax.swing.JPanel { if (waypoints.size() > 0) { MapWaypoint selection = waypoints.get(0); currentlySelectedWaypoint = selection; + currentlySelectedTrack = null; for (Set track : tracks) { if (track.contains(selection)) { currentlySelectedTrack = track; @@ -751,17 +779,16 @@ final public class MapPanel extends javax.swing.JPanel { * @return the new dot image */ private BufferedImage createTrackDotImage(Color color) { - int w = 10; - int h = 10; + int s = DOT_SIZE; - BufferedImage ret = new BufferedImage(w + 2, h + 2, BufferedImage.TYPE_INT_ARGB); + BufferedImage ret = new BufferedImage(s, s, BufferedImage.TYPE_INT_ARGB); Graphics2D g = ret.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(color); - g.fillOval(1, 1, w, h); + g.fillOval(1, 1, s - 2, s - 2); g.setColor(Color.BLACK); g.setStroke(new BasicStroke(1)); - g.drawOval(1, 1, w, h); + g.drawOval(1, 1, s - 2, s - 2); g.dispose(); return ret; } @@ -794,14 +821,11 @@ final public class MapPanel extends javax.swing.JPanel { public void paintWaypoint(Graphics2D g, JXMapViewer map, MapWaypoint waypoint) { Color color = getColor(waypoint); BufferedImage image; - int artifactType = waypoint.getArtifactTypeID(); Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom()); int x = (int) point.getX(); int y = (int) point.getY(); - if (artifactType == ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() - || artifactType == ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID() - || artifactType == ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) { + if (DOT_WAYPOINT_TYPES.contains(waypoint.getArtifactTypeID())) { image = dotImageCache.computeIfAbsent(color, k -> { return createTrackDotImage(color); }); From 8388070213abde091557b7e8f251626c9bd442e2 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Tue, 21 Apr 2020 22:54:34 -0400 Subject: [PATCH 13/35] 6267 Improved exception handling --- .../org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index c78c822af0..6cf9720e48 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -523,7 +523,12 @@ class GeoFilterPanel extends javax.swing.JPanel { resultSet.next(); count = resultSet.getLong("count"); } catch (SQLException ex) { - Exceptions.printStackTrace(ex); + Throwable cause = ex.getCause(); + if (cause != null) { + logger.log(Level.SEVERE, cause.getMessage(), cause); + } else { + logger.log(Level.SEVERE, ex.getMessage(), ex); + } } } return count; From 2f66b2ba1c65778b4b96ec8ede047e8bb8441593 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Wed, 22 Apr 2020 11:11:18 -0400 Subject: [PATCH 14/35] 6267 Updating query to be more generic --- .../autopsy/geolocation/GeoFilterPanel.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index 6cf9720e48..5c07368b8f 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -37,7 +37,6 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.SpinnerNumberModel; import javax.swing.SwingWorker; -import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; @@ -486,36 +485,35 @@ class GeoFilterPanel extends javax.swing.JPanel { } /** - * Get a count of TSK_METADATA_EXIF artifacts containing GPS data for + * Get a count of artifacts of the given type containing GPS data for * the given data case and source. Does not include rejected artifacts. * * @param sleuthkitCase - * @param dataSourceID + * @param dataSource + * @param artifactType * * @return The artifacts count that match the criteria * * @throws TskCoreException */ - public long getExifGPSDataCount(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException { + public long getGPSDataCount(SleuthkitCase sleuthkitCase, + DataSource dataSource, BlackboardArtifact.ARTIFACT_TYPE artifactType) throws TskCoreException { long count = 0; String queryStr - = "SELECT count(*) AS count FROM" - + " (" - + " SELECT artifact_obj_id, group_concat(attribute_type_id) FROM" + = "SELECT count(DISTINCT artifact_id) AS count FROM" + " (" + " SELECT * FROM blackboard_artifacts as arts" + " INNER JOIN blackboard_attributes as attrs" + " ON attrs.artifact_id = arts.artifact_id" - + " WHERE arts.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() + + " WHERE arts.artifact_type_id = " + artifactType.getTypeID() + " AND arts.data_source_obj_id = " + dataSource.getId() + " AND arts.review_status_id != " + BlackboardArtifact.ReviewStatus.REJECTED.getID() + " AND" + " (" + "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID() + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS.getTypeID() + " )" - + " )" - + "GROUP BY artifact_obj_id" + " )"; try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr)) { ResultSet resultSet = queryResult.getResultSet(); @@ -548,12 +546,7 @@ class GeoFilterPanel extends javax.swing.JPanel { private Map getGPSDataSources(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException { HashMap ret = new HashMap<>(); for (BlackboardArtifact.ARTIFACT_TYPE type : GPS_ARTIFACT_TYPES) { - long count; - if (type == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF) { - count = getExifGPSDataCount(sleuthkitCase, dataSource); - } else { - count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId()); - } + long count = getGPSDataCount(sleuthkitCase, dataSource, type); if (count > 0) { ret.put(type, count); } From e4540b250abe87285448f51987d4cb963e5baec8 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 22 Apr 2020 14:02:47 -0400 Subject: [PATCH 15/35] Making machine translation options panel links into hyperlinks. --- .../BingTranslatorSettingsPanel.form | 10 ++--- .../BingTranslatorSettingsPanel.java | 37 +++++++++++++++---- .../translators/Bundle.properties | 5 ++- .../translators/Bundle.properties-MERGED | 5 ++- .../translators/Bundle_ja.properties | 2 +- .../GoogleTranslatorSettingsPanel.form | 8 +--- .../GoogleTranslatorSettingsPanel.java | 31 ++++++++++++---- 7 files changed, 65 insertions(+), 33 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 18cd9b97af..c7efa80e28 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -190,20 +190,16 @@ - + - - - + - + - - diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 621aec9d2a..c8a019187d 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -32,7 +32,15 @@ import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.awt.Desktop; +import java.net.URISyntaxException; +import java.net.URL; import org.apache.commons.lang3.StringUtils; +import org.netbeans.core.actions.HTMLViewAction; +import org.openide.awt.HtmlBrowser; +import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; /** @@ -75,6 +83,23 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { populateComboBox(); selectLanguageByCode(code); targetLanguageCode = code; + + instructionsTextArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } + + } + } + }); } /** @@ -140,7 +165,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { testResultValueLabel = new javax.swing.JLabel(); authenticationKeyLabel = new javax.swing.JLabel(); instructionsScrollPane = new javax.swing.JScrollPane(); - instructionsTextArea = new javax.swing.JTextArea(); + instructionsTextArea = new javax.swing.JTextPane(); javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); setLayout(new java.awt.GridBagLayout()); @@ -265,12 +290,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { instructionsTextArea.setEditable(false); instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240)); - instructionsTextArea.setColumns(20); - instructionsTextArea.setLineWrap(true); - instructionsTextArea.setRows(4); - instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N - instructionsTextArea.setWrapStyleWord(true); - instructionsTextArea.setCaretPosition(0); + instructionsTextArea.setContentType("text/html"); // NOI18N + instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text_1")); // NOI18N instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200)); instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78)); instructionsScrollPane.setViewportView(instructionsTextArea); @@ -316,7 +337,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JTextField authenticationKeyField; private javax.swing.JLabel authenticationKeyLabel; private javax.swing.JScrollPane instructionsScrollPane; - private javax.swing.JTextArea instructionsTextArea; + private javax.swing.JTextPane instructionsTextArea; private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JLabel targetLanguageLabel; diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index b09c2ae682..5be720ce6f 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -13,5 +13,6 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: -BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup -GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
+BingTranslatorSettingsPanel.instructionsTextArea.text= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 4c32b7abab..ea3c6643a6 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -26,5 +26,6 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: -BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup -GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
+BingTranslatorSettingsPanel.instructionsTextArea.text= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties index 885df0f635..6ad3b7e741 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties @@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=\u672a\u7ffb\u8a33: GoogleTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=\u8a8d\u8a3c\u30ad\u30fc: -BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup GoogleTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eGoogle\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306b\u542b\u307e\u308c\u308bJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u4f5c\u6210\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u60c5\u5831\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u3042\u307e\u3059: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form index 67bf16ebf9..056479013d 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form @@ -212,20 +212,16 @@ - + - - - + - - diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index b9c6b852b1..f790a9541b 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -24,17 +24,21 @@ import com.google.cloud.translate.Language; import com.google.cloud.translate.Translate; import com.google.cloud.translate.TranslateOptions; import com.google.cloud.translate.Translation; +import java.awt.Desktop; import java.awt.event.ItemListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JFileChooser; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; @@ -59,6 +63,23 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageCode = languageCode; credentialsPathField.setText(credentialsPath); populateTargetLanguageComboBox(); + + instructionsTextArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } + + } + } + }); } /** @@ -198,7 +219,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { testUntranslatedTextField = new javax.swing.JTextField(); testButton = new javax.swing.JButton(); instructionsScrollPane = new javax.swing.JScrollPane(); - instructionsTextArea = new javax.swing.JTextArea(); + instructionsTextArea = new javax.swing.JTextPane(); javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); setLayout(new java.awt.GridBagLayout()); @@ -335,12 +356,8 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { instructionsTextArea.setEditable(false); instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240)); - instructionsTextArea.setColumns(20); - instructionsTextArea.setLineWrap(true); - instructionsTextArea.setRows(4); + instructionsTextArea.setContentType("text/html"); // NOI18N instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N - instructionsTextArea.setWrapStyleWord(true); - instructionsTextArea.setCaretPosition(0); instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200)); instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78)); instructionsScrollPane.setViewportView(instructionsTextArea); @@ -405,7 +422,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JButton browseButton; private javax.swing.JTextField credentialsPathField; private javax.swing.JScrollPane instructionsScrollPane; - private javax.swing.JTextArea instructionsTextArea; + private javax.swing.JTextPane instructionsTextArea; private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JButton testButton; From d34b1038abf586d140d6c1d88985ad6053839ed3 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 22 Apr 2020 15:13:13 -0400 Subject: [PATCH 16/35] Update with more review changes --- .../sleuthkit/autopsy/casemodule/Case.java | 30 ++- .../BlackBoardArtifactTagAddedEvent.java | 5 + .../BlackBoardArtifactTagDeletedEvent.java | 2 +- .../events/ContentTagAddedEvent.java | 5 + .../events/ContentTagDeletedEvent.java | 2 +- .../casemodule/events/TagAddedEvent.java | 7 +- .../services/TagNameDefinition.java | 205 +++++++++++------- .../casemodule/services/TagsManager.java | 11 +- 8 files changed, 169 insertions(+), 98 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 5a703a4ea9..6c6e102dac 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1555,7 +1555,19 @@ public class Case { * @param newTag new ContentTag added */ public void notifyContentTagAdded(ContentTag newTag) { - eventPublisher.publish(new ContentTagAddedEvent(newTag)); + notifyContentTagAdded(newTag, null); + } + + /** + * Notifies case event subscribers that a content tag has been added. + * + * This should not be called from the event dispatch thread (EDT) + * + * @param newTag new ContentTag added + * @param deletedTag Removed ContentTag + */ + public void notifyContentTagAdded(ContentTag newTag, ContentTag deletedTag) { + eventPublisher.publish(new ContentTagAddedEvent(newTag, deletedTag)); } /** @@ -1607,7 +1619,19 @@ public class Case { * @param newTag new BlackboardArtifactTag added */ public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag) { - eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag)); + notifyBlackBoardArtifactTagAdded(newTag, null); + } + + /** + * Notifies case event subscribers that an artifact tag has been added. + * + * This should not be called from the event dispatch thread (EDT) + * + * @param newTag new BlackboardArtifactTag added + * @param removedTag The BlackboardArtifactTag that was removed. + */ + public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) { + eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag, removedTag)); } /** @@ -2006,7 +2030,7 @@ public class Case { /** * Starts a background task that reads a sector from each file system of - * each image of a case to do an eager open of the filesystems in the case. + * each image of a case to do an eager open of the filesystems in the case. * If this method is called before another background file system read has * finished the earlier one will be cancelled. * diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java index 8c2a2d6dfa..45068164c1 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java @@ -22,6 +22,7 @@ import java.io.Serializable; import javax.annotation.concurrent.Immutable; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo; import org.sleuthkit.datamodel.BlackboardArtifactTag; import org.sleuthkit.datamodel.TskCoreException; @@ -37,6 +38,10 @@ public class BlackBoardArtifactTagAddedEvent extends TagAddedEvent implements S public ContentTagAddedEvent(ContentTag newTag) { super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag); } + + public ContentTagAddedEvent(ContentTag newTag, ContentTag deletedTag) { + super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag, (deletedTag != null ? new DeletedContentTagInfo(deletedTag) : null)); + } /** * get the ContentTag that was added by its id diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java index 406ef58a0b..4a1a240ca4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java @@ -58,7 +58,7 @@ public class ContentTagDeletedEvent extends TagDeletedEvent implemen private final long beginByteOffset; private final long endByteOffset; - private DeletedContentTagInfo(ContentTag deletedTag) { + DeletedContentTagInfo(ContentTag deletedTag) { super(deletedTag); beginByteOffset = deletedTag.getBeginByteOffset(); endByteOffset = deletedTag.getEndByteOffset(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java index 6d7ebb4f9c..ab737d7004 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.events; import java.io.Serializable; import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.casemodule.events.TagDeletedEvent.DeletedTagInfo; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.datamodel.Tag; @@ -46,7 +47,11 @@ abstract class TagAddedEvent extends AutopsyEvent implements Seri private final Long tagID; TagAddedEvent(String propertyName, T addedTag) { - super(propertyName, null, null); + this(propertyName, addedTag, null); + } + + TagAddedEvent(String propertyName, T addedTag, DeletedTagInfo deletedTagInfo) { + super(propertyName, deletedTagInfo, null); tag = addedTag; tagID = addedTag.getId(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index c3e800b61f..ee54d7bf51 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -21,7 +21,9 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -59,7 +61,7 @@ final class TagNameDefinition implements Comparable { private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion"; - private static final String TAG_SETTINGS_VERSION = "1"; + private static final int TAG_SETTINGS_VERSION = 1; private final String displayName; private final String description; @@ -238,90 +240,30 @@ final class TagNameDefinition implements Comparable { * @return A set of tag name definition objects. */ static synchronized Set getTagNameDefinitions() { - Set tagNames = new LinkedHashSet<>(); - String customTagsList = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); - if (null != customTagsList && !customTagsList.isEmpty()) { - List customTagDefinitions = Arrays.asList(customTagsList.split(";")); - int numberOfAttributes = 0; - List tagDefinitions = new ArrayList<>(); - if (!customTagDefinitions.isEmpty()) { - // Use the first entry in the list to figure out if there are 3 - // or four tag attributes in the file. - numberOfAttributes = customTagDefinitions.get(0).split(",").length; - } - if (numberOfAttributes == 3) { - // Get the known status from the Central Repository - String crTagKnownProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS - List knownTagNameList = new ArrayList<>(); - if (crTagKnownProp != null && !crTagKnownProp.isEmpty()) { - knownTagNameList.addAll(Arrays.asList(crTagKnownProp.split(","))); - } - - tagDefinitions = buildTagNameDefinitions(customTagDefinitions, knownTagNameList); - } else if (numberOfAttributes == 4) { - tagDefinitions = buildTagNameDefinitions(customTagDefinitions); - } - - // Remove the standard and project vic tags. - List standardTagNames = getStandardTagNames(); - for (TagNameDefinition def : tagDefinitions) { - if (!standardTagNames.contains(def.getDisplayName())) { - tagNames.add(def); - } - } - } - return tagNames; - } - - /** - * Returns a list of TagNameDefinitons created by merging the tag data from - * the properties file and the known status information from the central - * repository. - * - * @param tagProperties List of description strings. - * @param centralRepoNotableTags List of known tag names. - * - * @return A list of TagNameDefinitions. - */ - private static List buildTagNameDefinitions(List tagProperties, List centralRepoNotableTags) { - List tagNameDefinitions = new ArrayList<>(); - - for (String propertyString : tagProperties) { - // Split the property into attributes - String[] attributes = propertyString.split(","); //get the attributes - String tagName = attributes[0]; - TskData.FileKnown knownStatus = TskData.FileKnown.UNKNOWN; - - if (centralRepoNotableTags.contains(tagName)) { - knownStatus = TskData.FileKnown.BAD; - } - - tagNameDefinitions.add(new TagNameDefinition(tagName, attributes[1], - TagName.HTML_COLOR.valueOf(attributes[2]), knownStatus)); + if (needsVersionUpdate()) { + updateTagDefinitions(); } - return tagNameDefinitions; - } - - /** - * Read the Tags.properties file to get the TagNameDefinitions that are - * preserved across cases. - * - * @param tagProperties List of description strings. - * - * @param standardTagsToBeCreated the list of standard tags which have yet - * to be created - * - * @return tagNames a list of TagNameDefinitions - */ - private static List buildTagNameDefinitions(List tagProperties) { - List tagNameDefinitions = new ArrayList<>(); - for (String tagNameTuple : tagProperties) { - String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - tagNameDefinitions.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); + String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); + if (tagsProperty == null || tagsProperty.isEmpty()) { + return new HashSet<>(); } - return tagNameDefinitions; + + List individualTags = Arrays.asList(tagsProperty.split(";")); + + if (individualTags == null || individualTags.isEmpty()) { + return new HashSet<>(); + } + + Set definitions = new HashSet<>(); + for (String tagProps : individualTags) { + String[] attributes = tagProps.split(","); + + definitions.add(new TagNameDefinition(attributes[0], attributes[1], + TagName.HTML_COLOR.valueOf(attributes[2]), TskData.FileKnown.valueOf(attributes[3]))); + } + + return definitions; } /** @@ -344,8 +286,105 @@ final class TagNameDefinition implements Comparable { } } - ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, TAG_SETTINGS_VERSION); + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString()); } + /** + * Updates the Tag Definition file to the current format. + */ + private static void updateTagDefinitions() { + Integer version = getPropertyFileVersion(); + List definitions = new ArrayList<>(); + + if (version == null) { + String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); + if (tagsProperty == null || tagsProperty.isEmpty()) { + return; + } + + List individualTags = Arrays.asList(tagsProperty.split(";")); + + if (individualTags == null || individualTags.isEmpty()) { + return; + } + + List notableTagList = null; + for (String tagProps : individualTags) { + String[] attributes = tagProps.split(","); + TskData.FileKnown fileKnown = TskData.FileKnown.UNKNOWN; + if (attributes.length == 3) { + // If notableTagList is null load it from the CR. + if (notableTagList == null) { + String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS + if (notableTagsProp != null && !notableTagsProp.isEmpty()) { + notableTagList = Arrays.asList(notableTagsProp.split(",")); + } else { + notableTagList = new ArrayList<>(); + } + } else { + if (notableTagList.contains(attributes[0])) { + fileKnown = TskData.FileKnown.BAD; + } + } + } else { + fileKnown = TskData.FileKnown.valueOf(attributes[3]); + } + + definitions.add(new TagNameDefinition(attributes[0], attributes[1], + TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown)); + } + } else { + // FUTURE UPDATES HERE + } + + if (definitions.isEmpty()) { + return; + } + + // Remove the standard and Project VIC tags from the list + List tagStrings = new ArrayList<>(); + List standardTags = getStandardTagNames(); + for (TagNameDefinition def : definitions) { + if (!standardTags.contains(def.getDisplayName())) { + tagStrings.add(def.toSettingsFormat()); + } + } + + // Write out the version and the new tag list. + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings)); + } + + /** + * Base on the version in the Tags property file, returns whether or not the + * file needs updating. + * + * @return + */ + private static boolean needsVersionUpdate() { + Integer version = getPropertyFileVersion(); + return version == null || version < TAG_SETTINGS_VERSION; + } + + /** + * Returns the Tags property file version. + * + * @return The current version of tags property file, or null if no version + * was found. + */ + private static Integer getPropertyFileVersion() { + String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY); + if (version == null || version.isEmpty()) { + return null; + } + + try { + return Integer.parseInt(version); + } catch (NumberFormatException ex) { + // The version is not an integer + return null; + } + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index 786c76ec7b..728ddf594a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -479,11 +479,8 @@ public class TagsManager implements Closeable { try { Case currentCase = Case.getCurrentCaseThrows(); - for (ContentTag tag : tagChange.getRemovedTags()) { - currentCase.notifyContentTagDeleted(tag); - } + currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0)); - currentCase.notifyContentTagAdded(tagChange.getAddedTag()); } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } @@ -702,11 +699,7 @@ public class TagsManager implements Closeable { TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment); try { Case currentCase = Case.getCurrentCaseThrows(); - - for (BlackboardArtifactTag tag : tagChange.getRemovedTags()) { - currentCase.notifyBlackBoardArtifactTagDeleted(tag); - } - currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag()); + currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0)); } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } From bbc2fe1a73d7f9276627174795e84c76b362c9f4 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 22 Apr 2020 15:46:28 -0400 Subject: [PATCH 17/35] Added links to machine translation doc --- docs/doxygen-user/machine_translation.dox | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/doxygen-user/machine_translation.dox b/docs/doxygen-user/machine_translation.dox index 0bce206700..ebcf6e069d 100644 --- a/docs/doxygen-user/machine_translation.dox +++ b/docs/doxygen-user/machine_translation.dox @@ -4,7 +4,11 @@ You can configure a machine translation service to use with Autopsy. If one is c \section mt_config Configuration -To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. +To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. You will have to set up an account with either Bing or Google and then enter account information. + \image html mt_config.png From aab122125e9a2c307bd1c8b27053619833f71383 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 22 Apr 2020 16:08:24 -0400 Subject: [PATCH 18/35] Removed unused message --- .../autopsy/texttranslation/translators/Bundle.properties | 1 - .../autopsy/texttranslation/translators/Bundle.properties-MERGED | 1 - 2 files changed, 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 5be720ce6f..90f5311052 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -14,5 +14,4 @@ GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
-BingTranslatorSettingsPanel.instructionsTextArea.text= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index ea3c6643a6..1f71c6f2c0 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -27,5 +27,4 @@ GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
-BingTranslatorSettingsPanel.instructionsTextArea.text= From 571ea2302b6a8a10b9f9050454ee39711f25dfad Mon Sep 17 00:00:00 2001 From: apriestman Date: Thu, 23 Apr 2020 07:12:56 -0400 Subject: [PATCH 19/35] Removed unused imports --- .../translators/BingTranslatorSettingsPanel.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index c8a019187d..04e978dfa9 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -36,11 +36,7 @@ import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import java.awt.Desktop; import java.net.URISyntaxException; -import java.net.URL; import org.apache.commons.lang3.StringUtils; -import org.netbeans.core.actions.HTMLViewAction; -import org.openide.awt.HtmlBrowser; -import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; /** From 541fb42bb852b193f2a6d6e398f85de028bd0212 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Thu, 23 Apr 2020 10:24:36 -0400 Subject: [PATCH 20/35] 6285 Codacy --- Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java index eea578b0c0..242d8e81d6 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java @@ -88,7 +88,7 @@ final public class MapPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(MapPanel.class.getName()); private static final long serialVersionUID = 1L; - private static final HashSet DOT_WAYPOINT_TYPES = new HashSet<>(); + private static final Set DOT_WAYPOINT_TYPES = new HashSet<>(); private static final int DOT_SIZE = 12; private boolean zoomChanging; From 36ced0b39113c1295607823a1d07a4e688c81d15 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 23 Apr 2020 10:37:38 -0400 Subject: [PATCH 21/35] improved logging --- .../sleuthkit/autopsy/communications/CommunicationsGraph.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java index 38a20d07e5..f07d4d52ab 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java @@ -209,7 +209,7 @@ final class CommunicationsGraph extends mxGraph { try { adiRelationshipsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, currentFilter); } catch (TskCoreException tskCoreException) { - logger.log(Level.SEVERE, "Error", tskCoreException); + logger.log(Level.SEVERE, "There was an error fetching relationships for the node: " + accountDeviceInstance, tskCoreException); } double size = Math.sqrt(adiRelationshipsCount) + 10; From 0bd9a1bfa0bb2699955d437effc225ca24f88c97 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Thu, 23 Apr 2020 10:43:41 -0400 Subject: [PATCH 22/35] 6267 Codacy --- .../sleuthkit/autopsy/geolocation/GeoFilterPanel.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index 5c07368b8f..dcea91c93d 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -513,13 +513,14 @@ class GeoFilterPanel extends javax.swing.JPanel { + "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID() + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID() + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS.getTypeID() + " )" + " )"; try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr)) { - ResultSet resultSet = queryResult.getResultSet(); - try { - resultSet.next(); - count = resultSet.getLong("count"); + try (ResultSet resultSet = queryResult.getResultSet()) { + if (resultSet.next()) { + count = resultSet.getLong("count"); + } } catch (SQLException ex) { Throwable cause = ex.getCause(); if (cause != null) { From 11d9613bb34aeec61f6f24287d02cadc2502edc6 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Thu, 23 Apr 2020 10:52:45 -0400 Subject: [PATCH 23/35] 6267 Condense try-with-resources --- .../autopsy/geolocation/GeoFilterPanel.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index dcea91c93d..5f47502c58 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -516,18 +516,17 @@ class GeoFilterPanel extends javax.swing.JPanel { + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS.getTypeID() + " )" + " )"; - try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr)) { - try (ResultSet resultSet = queryResult.getResultSet()) { - if (resultSet.next()) { - count = resultSet.getLong("count"); - } - } catch (SQLException ex) { - Throwable cause = ex.getCause(); - if (cause != null) { - logger.log(Level.SEVERE, cause.getMessage(), cause); - } else { - logger.log(Level.SEVERE, ex.getMessage(), ex); - } + try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr); + ResultSet resultSet = queryResult.getResultSet()) { + if (resultSet.next()) { + count = resultSet.getLong("count"); + } + } catch (SQLException ex) { + Throwable cause = ex.getCause(); + if (cause != null) { + logger.log(Level.SEVERE, cause.getMessage(), cause); + } else { + logger.log(Level.SEVERE, ex.getMessage(), ex); } } return count; From 6f0ac6ae0cc11e5cd79af3a18c2c46bf0d8cb642 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 23 Apr 2020 14:33:03 -0400 Subject: [PATCH 24/35] removed blank mime types --- .../org/sleuthkit/autopsy/coreutils/FileTypeUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java index 92615a5768..ab2be73340 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java @@ -19,11 +19,13 @@ package org.sleuthkit.autopsy.coreutils; import com.google.common.collect.ImmutableSet; +import java.util.Arrays; import static java.util.Arrays.asList; import java.util.Collection; import java.util.Collections; import javax.imageio.ImageIO; import static org.apache.commons.collections4.ListUtils.removeAll; +import org.apache.commons.lang.StringUtils; import org.openide.util.NbBundle; /** @@ -33,7 +35,12 @@ public final class FileTypeUtils { private static final ImmutableSet IMAGE_MIME_TYPES = new ImmutableSet.Builder() - .addAll(removeAll(asList(ImageIO.getReaderMIMETypes()), + .addAll(removeAll( + asList( + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + Arrays.stream(ImageIO.getReaderMIMETypes()) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) + .toArray(String[]::new)), asList("application/octet-stream"))) //this claims to be supported, but is not really an image. .add("image/bmp", //NON-NLS "image/gif", //NON-NLS From 86a565d7edbed442c85e1383f0968cd53ecb5b1c Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Fri, 24 Apr 2020 11:59:23 -0400 Subject: [PATCH 25/35] 6267: public -> private --- Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index 5f47502c58..d8121e68a1 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -496,7 +496,7 @@ class GeoFilterPanel extends javax.swing.JPanel { * * @throws TskCoreException */ - public long getGPSDataCount(SleuthkitCase sleuthkitCase, + private long getGPSDataCount(SleuthkitCase sleuthkitCase, DataSource dataSource, BlackboardArtifact.ARTIFACT_TYPE artifactType) throws TskCoreException { long count = 0; String queryStr From 33ef944becf4214684b68d67202236e51268bc49 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 24 Apr 2020 15:27:09 -0400 Subject: [PATCH 26/35] More review changes --- .../services/TagNameDefinition.java | 52 +++++++++++-------- .../casemodule/services/TagNameDialog.java | 2 +- .../casemodule/services/TagOptionsPanel.java | 1 + .../casemodule/services/TagsManager.java | 10 ++-- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index ee54d7bf51..c6ba53ac47 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -21,10 +21,8 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -51,17 +49,18 @@ final class TagNameDefinition implements Comparable { @NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark", "TagNameDefinition.predefTagNames.followUp.text=Follow Up", "TagNameDefinition.predefTagNames.notableItem.text=Notable Item", - "Category.one=CAT-1: Child Exploitation (Illegal)", - "Category.two=CAT-2: Child Exploitation (Non-Illegal/Age Difficult)", - "Category.three=CAT-3: CGI/Animation (Child Exploitive)", - "Category.four=CAT-4: Exemplar/Comparison (Internal Use Only)", - "Category.five=CAT-5: Non-pertinent", - "Category.zero=CAT-0: Uncategorized"}) + }) private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion"; private static final int TAG_SETTINGS_VERSION = 1; + + private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)"; + private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"; + private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)"; + private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)"; + private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent"; private final String displayName; private final String description; @@ -76,11 +75,11 @@ final class TagNameDefinition implements Comparable { STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); - PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_one(), new TagNameDefinition(Bundle.Category_one(), "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); - PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_two(), new TagNameDefinition(Bundle.Category_two(), "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); - PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_three(), new TagNameDefinition(Bundle.Category_three(), "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); - PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_four(), new TagNameDefinition(Bundle.Category_four(), "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); - PROJECT_VIC_TAG_DEFINITIONS.put(Bundle.Category_five(), new TagNameDefinition(Bundle.Category_five(), "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_ONE_NAME, new TagNameDefinition(CATEGORY_ONE_NAME, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_TWO_NAME, new TagNameDefinition(CATEGORY_TWO_NAME, "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_THREE_NAME, new TagNameDefinition(CATEGORY_THREE_NAME, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FOUR_NAME, new TagNameDefinition(CATEGORY_FOUR_NAME, "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FIVE_NAME, new TagNameDefinition(CATEGORY_FIVE_NAME, "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); } /** @@ -316,12 +315,7 @@ final class TagNameDefinition implements Comparable { if (attributes.length == 3) { // If notableTagList is null load it from the CR. if (notableTagList == null) { - String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS - if (notableTagsProp != null && !notableTagsProp.isEmpty()) { - notableTagList = Arrays.asList(notableTagsProp.split(",")); - } else { - notableTagList = new ArrayList<>(); - } + notableTagList = getCRNotableList(); } else { if (notableTagList.contains(attributes[0])) { fileKnown = TskData.FileKnown.BAD; @@ -334,10 +328,8 @@ final class TagNameDefinition implements Comparable { definitions.add(new TagNameDefinition(attributes[0], attributes[1], TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown)); } - } else { - // FUTURE UPDATES HERE - } - + } + if (definitions.isEmpty()) { return; } @@ -355,6 +347,20 @@ final class TagNameDefinition implements Comparable { ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings)); } + + /** + * Returns a list notable tag names from the CR bagTag list. + * + * @return A list of tag names, or empty list if none were found. + */ + private static List getCRNotableList() { + String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS + if (notableTagsProp != null && !notableTagsProp.isEmpty()) { + return Arrays.asList(notableTagsProp.split(",")); + } + + return new ArrayList<>(); + } /** * Base on the version in the Tags property file, returns whether or not the diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java index 5b2bb75da5..79207aaaaa 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java @@ -140,7 +140,7 @@ final class TagNameDialog extends javax.swing.JDialog { return; } //if a tag name contains illegal characters and is not the name of one of the standard tags - if (TagsManager.containsIllegalCharacters(newTagDisplayName)) { + if (TagsManager.containsIllegalCharacters(newTagDisplayName) && !TagNameDefinition.getStandardTagNames().contains(newTagDisplayName)) { JOptionPane.showMessageDialog(this, NbBundle.getMessage(TagNameDialog.class, "TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.message"), NbBundle.getMessage(TagNameDialog.class, "TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.title"), diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java index 0e5ebeb4ea..2ef9869adc 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java @@ -446,6 +446,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel { boolean isSelected = tagNamesList.getSelectedIndex() != -1; boolean enableEdit = !ingestIsRunning && isSelected; editTagNameButton.setEnabled(enableEdit); + deleteTagNameButton.setEnabled(enableEdit); if (isSelected) { descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription()); if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index 728ddf594a..d03adff91c 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -54,6 +54,8 @@ public class TagsManager implements Closeable { private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName()); private final SleuthkitCase caseDb; + + static String DEFAULT_TAG_SET_NAME = "Project VIC (United States)"; static { @@ -178,12 +180,12 @@ public class TagsManager implements Closeable { List setList = taggingMgr.getTagSets(); if (setList.isEmpty()) { //Assume new case and add Project VIC tags. - TagSet set = taggingMgr.addTagSet("Project VIC (United States)"); - + + List tagNameList = new ArrayList<>(); for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) { - TagName tagName = caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); - taggingMgr.addTagNameToTagSet(set, tagName); + tagNameList.add( caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus())); } + taggingMgr.addTagSet(DEFAULT_TAG_SET_NAME, tagNameList); for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) { caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); From 3eb244d4d36000a9611d92ddea68a3ae078b38b0 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Sat, 25 Apr 2020 12:20:29 -0400 Subject: [PATCH 27/35] Picked up properties file changes --- .../autopsy/casemodule/services/Bundle.properties-MERGED | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED index 8fa5d9888b..5e79318334 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties-MERGED @@ -1,9 +1,3 @@ -Category.five=CAT-5: Non-pertinent -Category.four=CAT-4: Exemplar/Comparison (Internal Use Only) -Category.one=CAT-1: Child Exploitation (Illegal) -Category.three=CAT-3: CGI/Animation (Child Exploitive) -Category.two=CAT-2: Child Exploitation (Non-Illegal/Age Difficult) -Category.zero=CAT-0: Uncategorized OptionsCategory_Name_TagNamesOptions=Tags OptionsCategory_TagNames=TagNames TagNameDefinition.predefTagNames.bookmark.text=Bookmark From e25eb3327776a04dbc488b1db934a0d1aa93ffac Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 27 Apr 2020 12:10:41 -0400 Subject: [PATCH 28/35] other defensive code for imageio spi changes --- .../autopsy/coreutils/FileTypeUtils.java | 2 ++ .../autopsy/coreutils/ImageUtils.java | 20 +++++++++++++++++-- .../autopsy/imagegallery/FileTypeUtils.java | 10 +++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java index ab2be73340..b45b3b6867 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java @@ -38,6 +38,8 @@ public final class FileTypeUtils { .addAll(removeAll( asList( // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) Arrays.stream(ImageIO.getReaderMIMETypes()) .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) .toArray(String[]::new)), diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java index c89ee7d4f7..5f1653bf7a 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java @@ -46,6 +46,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javafx.concurrent.Task; import javafx.embed.swing.SwingFXUtils; import javax.annotation.Nonnull; @@ -137,11 +139,25 @@ public class ImageUtils { } FFMPEG_LOADED = tempFfmpegLoaded; - SUPPORTED_IMAGE_EXTENSIONS.addAll(Arrays.asList(ImageIO.getReaderFileSuffixes())); + // remove any empty extension types provided by ImageIO.getReaderFileSuffixes() + // This prevents extensions added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + List imageSuffixList = Arrays.stream(ImageIO.getReaderFileSuffixes()) + .filter((extension) -> StringUtils.isNotBlank(extension)) + .collect(Collectors.toList()); + + SUPPORTED_IMAGE_EXTENSIONS.addAll(imageSuffixList); SUPPORTED_IMAGE_EXTENSIONS.add("tec"); // Add JFIF .tec files SUPPORTED_IMAGE_EXTENSIONS.removeIf("db"::equals); // remove db files - SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(Arrays.asList(ImageIO.getReaderMIMETypes())); + List mimeTypeList = Stream.of(ImageIO.getReaderMIMETypes()) + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) + .collect(Collectors.toList()); + + SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(mimeTypeList); /* * special cases and variants that we support, but don't get registered * with ImageIO automatically diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java index fb8a4d47ec..675af9aea3 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java @@ -94,6 +94,10 @@ public enum FileTypeUtils { ImageIO.scanForPlugins(); //add all extension ImageIO claims to support imageExtensions.addAll(Stream.of(ImageIO.getReaderFileSuffixes()) + // remove any empty extension types provided by ImageIO.getReaderFileSuffixes() + // This prevents extensions added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((extension) -> StringUtils.isNotBlank(extension)) .map(String::toLowerCase) .collect(Collectors.toList())); //add list of known image extensions @@ -144,8 +148,12 @@ public enum FileTypeUtils { * are not images) to show up in Image Gallery. * supportedMimeTypes.addAll(Arrays.asList("application/x-emf")); */ - //add list of mimetypes ImageIO claims to support + //add list of mimetypes ImageIO claims to support supportedMimeTypes.addAll(Stream.of(ImageIO.getReaderMIMETypes()) + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) .map(String::toLowerCase) .collect(Collectors.toList())); From 41e943d7ea43127964297c2e9c4fbd2a2ee40b8d Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Mon, 27 Apr 2020 13:23:37 -0400 Subject: [PATCH 29/35] Added password dialog --- .../autopsy/contentviewers/PDFViewer.java | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java index 52c6a93558..3ecca358b8 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java @@ -21,19 +21,24 @@ package org.sleuthkit.autopsy.contentviewers; import java.awt.BorderLayout; import java.awt.Component; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.ResourceBundle; import java.util.concurrent.ExecutionException; import java.util.logging.Level; + import javax.swing.JPanel; +import javax.swing.SwingUtilities; import javax.swing.SwingWorker; +import org.icepdf.core.SecurityCallback; import org.openide.util.NbBundle; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.ReadContentInputStream; + import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -42,6 +47,7 @@ import org.icepdf.core.exceptions.PDFSecurityException; import org.icepdf.core.pobjects.Document; import org.icepdf.ri.common.ComponentKeyBinding; +import org.icepdf.ri.common.MyGUISecurityCallback; import org.icepdf.ri.common.SwingController; import org.icepdf.ri.common.SwingViewBuilder; import org.icepdf.ri.common.views.DocumentViewControllerImpl; @@ -51,14 +57,14 @@ import org.icepdf.ri.util.PropertiesManager; /** * Application content viewer for PDF files. */ -public class PDFViewer implements FileTypeViewer { +final class PDFViewer implements FileTypeViewer { private static final Logger logger = Logger.getLogger(PDFViewer.class.getName()); private JPanel container; private final PropertiesManager propsManager; - public PDFViewer() { + PDFViewer() { container = createNewContainer(); propsManager = getCustomProperties(); } @@ -97,7 +103,13 @@ public class PDFViewer implements FileTypeViewer { protected Document doInBackground() throws PDFException, PDFSecurityException, IOException { ReadContentInputStream stream = new ReadContentInputStream(file); Document doc = new Document(); - // This will read the stream into memory. + + // Prompts the user for a password if the document is password + // protected. + doc.setSecurityCallback(createPasswordDialogCallback()); + + // This will read the stream into memory and invoke the + // security callback if needed. doc.setInputStream(stream, null); return doc; } @@ -189,4 +201,27 @@ public class PDFViewer implements FileTypeViewer { private void showEncryptionDialog() { MessageNotifyUtil.Message.error(Bundle.PDFViewer_encryptedDialog()); } + + /** + * Creates a callback that will prompt the user for password input. + */ + private SecurityCallback createPasswordDialogCallback() { + // MyGUISecurityCallback is a reference implementation from IcePDF. + return new MyGUISecurityCallback(null, ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE)) { + private String password; + + @Override + public String requestPassword(Document document) { + try { + SwingUtilities.invokeAndWait(() -> { + // Show the password dialog on the EDT. + this.password = super.requestPassword(document); + }); + return this.password; + } catch (InterruptedException | InvocationTargetException ex) { + return null; + } + } + }; + } } From c7c0bdbc07b56825562ca154da53a55665c8650f Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 27 Apr 2020 13:27:16 -0400 Subject: [PATCH 30/35] Few small review changes --- .../casemodule/Bundle.properties-MERGED | 6 ++- .../services/TagNameDefinition.java | 43 ++++++++++--------- .../casemodule/services/TagsManager.java | 6 +-- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED index b56e46b377..f5c18a1640 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED @@ -55,6 +55,10 @@ Case.exceptionMessage.unsupportedSchemaVersionMessage=Unsupported case database Case.lockingException.couldNotAcquireExclusiveLock=Failed to get a exclusive lock on the case. Case.lockingException.couldNotAcquireSharedLock=Failed to get an shared lock on the case. Case.open.exception.multiUserCaseNotEnabled=Cannot open a multi-user case if multi-user cases are not enabled. See Tools, Options, Multi-User. +# {0} - image +Case.openFileSystems.openingImage=Opening all filesystems for image: {0}... +# {0} - case +Case.openFileSystems.retrievingImages=Retrieving images for case: {0}... Case.progressIndicatorCancelButton.label=Cancel Case.progressIndicatorTitle.closingCase=Closing Case Case.progressIndicatorTitle.creatingCase=Creating Case @@ -186,7 +190,6 @@ NewCaseVisualPanel1.caseNameLabel.text_1=Case Name: NewCaseVisualPanel1.caseDirLabel.text=Base Directory: NewCaseVisualPanel1.caseDirBrowseButton.text=Browse NewCaseVisualPanel1.caseNameTextField.text_1= -NewCaseVisualPanel1.jLabel2.text_1=Case data will be stored in the following directory: NewCaseVisualPanel1.caseParentDirTextField.text= NewCaseVisualPanel1.caseDirTextField.text_1= CueBannerPanel.autopsyLogo.text= @@ -467,3 +470,4 @@ UnpackagePortableCaseProgressDialog.okButton.text=OK UnpackagePortableCaseProgressDialog.resultLabel.text=resultLabel UnpackagePortableCaseDialog.extractLabel.text=Folder to extract to: UnpackagePortableCaseDialog.caseLabel.text=Portable Case: +NewCaseVisualPanel1.caseDataStoredLabel.text_1=Case data will be stored in the following directory: diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index c6ba53ac47..2e70d407a0 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -29,7 +30,7 @@ import java.util.Objects; import java.util.Set; import java.util.logging.Level; import javax.annotation.concurrent.Immutable; -import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; @@ -46,21 +47,21 @@ import org.sleuthkit.datamodel.TskData; final class TagNameDefinition implements Comparable { private static final Logger LOGGER = Logger.getLogger(TagNameDefinition.class.getName()); - @NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark", + @Messages({ + "TagNameDefinition.predefTagNames.bookmark.text=Bookmark", "TagNameDefinition.predefTagNames.followUp.text=Follow Up", - "TagNameDefinition.predefTagNames.notableItem.text=Notable Item", - }) + "TagNameDefinition.predefTagNames.notableItem.text=Notable Item",}) private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion"; private static final int TAG_SETTINGS_VERSION = 1; - - private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)"; - private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"; - private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)"; - private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)"; - private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent"; + + private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)"; + private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"; + private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)"; + private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)"; + private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent"; private final String displayName; private final String description; @@ -98,12 +99,12 @@ final class TagNameDefinition implements Comparable { this.knownStatus = status; } - static Collection getStandardTagNameDefinitions() { - return STANDARD_TAGS_DEFINITIONS.values(); + static Collection getProjectVICDefaultDefinitions() { + return Collections.unmodifiableCollection(PROJECT_VIC_TAG_DEFINITIONS.values()); } - static Collection getProjectVICDefaultDefinitions() { - return PROJECT_VIC_TAG_DEFINITIONS.values(); + static Collection getStandardTagNameDefinitions() { + return Collections.unmodifiableCollection(STANDARD_TAGS_DEFINITIONS.values()); } static List getStandardTagNames() { @@ -328,8 +329,8 @@ final class TagNameDefinition implements Comparable { definitions.add(new TagNameDefinition(attributes[0], attributes[1], TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown)); } - } - + } + if (definitions.isEmpty()) { return; } @@ -347,13 +348,13 @@ final class TagNameDefinition implements Comparable { ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings)); } - + /** * Returns a list notable tag names from the CR bagTag list. - * + * * @return A list of tag names, or empty list if none were found. */ - private static List getCRNotableList() { + private static List getCRNotableList() { String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS if (notableTagsProp != null && !notableTagsProp.isEmpty()) { return Arrays.asList(notableTagsProp.split(",")); @@ -363,8 +364,8 @@ final class TagNameDefinition implements Comparable { } /** - * Base on the version in the Tags property file, returns whether or not the - * file needs updating. + * Based on the version in the Tags property file, returns whether or not + * the file needs updating. * * @return */ diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index d03adff91c..5bdb2dc64e 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -54,7 +54,7 @@ public class TagsManager implements Closeable { private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName()); private final SleuthkitCase caseDb; - + static String DEFAULT_TAG_SET_NAME = "Project VIC (United States)"; static { @@ -180,10 +180,10 @@ public class TagsManager implements Closeable { List setList = taggingMgr.getTagSets(); if (setList.isEmpty()) { //Assume new case and add Project VIC tags. - + List tagNameList = new ArrayList<>(); for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) { - tagNameList.add( caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus())); + tagNameList.add(caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus())); } taggingMgr.addTagSet(DEFAULT_TAG_SET_NAME, tagNameList); From 058c71dabf3ae083310c6889a0fc202d12f10f8a Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 28 Apr 2020 15:49:50 -0400 Subject: [PATCH 31/35] remove leading comma --- .../hashdatabase/AddHashValuesToDatabaseProgressDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java index de6b84bdce..99eecf50d2 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java @@ -164,8 +164,9 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog { Matcher m = md5Pattern.matcher(hashEntry); if (m.find()) { // Is there any text left on this line? If so, treat it as a comment. - final String comment = hashEntry.substring(m.end()).trim(); + String comment = hashEntry.substring(m.end()).trim(); if (comment.length() > 0) { + comment = (comment.charAt(0) == ',') ? comment.substring(1) : comment; hashes.add(new HashEntry(null, m.group(0), null, null, comment)); } else { // more information can be added to the HashEntry - sha-1, sha-512, comment From 188dddd5541d182098387101b9c5621a0d0b0695 Mon Sep 17 00:00:00 2001 From: esaunders Date: Tue, 28 Apr 2020 16:23:58 -0400 Subject: [PATCH 32/35] Added link to Mac OS write up. --- Running_Linux_OSX.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Running_Linux_OSX.txt b/Running_Linux_OSX.txt index 0427c003b4..0ada2fd44c 100644 --- a/Running_Linux_OSX.txt +++ b/Running_Linux_OSX.txt @@ -45,7 +45,9 @@ Autopsy depends on a specific version of The Sleuth Kit. You need the Java libr - Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. For example: -- % sudo apt install ./sleuthkit-java_4.8.0-1_amd64.deb -- OS X: Build The Sleuth Kit from source. See https://github.com/sleuthkit/sleuthkit/blob/develop/INSTALL.txt for details. +- OS X: Build The Sleuth Kit from source. + See https://slo-sleuth.github.io/tools/InstallingAutopsyOnMacOS.html for a comprehensive write-up + on building The Sleuth Kit and getting Autopsy to run on Mac OS. * Install Autopsy * From cf898f3681195de573a071eceee9d2e624e68e67 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Tue, 28 Apr 2020 17:15:56 -0400 Subject: [PATCH 33/35] Externalized the bundle messages for future japanese translation --- .../autopsy/contentviewers/Bundle.properties | 861 ++++++++++++++++++ .../contentviewers/Bundle.properties-MERGED | 861 ++++++++++++++++++ .../autopsy/contentviewers/PDFViewer.java | 15 +- 3 files changed, 1732 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties index cf07682e5d..ebc9a58e1a 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties @@ -1,3 +1,19 @@ +# Copyright 2014-2020 Basis Technology Corp. +# +# Copyright 2006-2017 ICEsoft Technologies Canada Corp. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an "AS +# IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language +# governing permissions and limitations under the License. +# FXVideoPanel.pauseButton.infoLabel.playbackErr=Unable to play video. FXVideoPanel.progress.bufferingCancelled=media buffering was canceled @@ -93,3 +109,848 @@ MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: + +# The following message properties were taken from IcePDF 6.2.2 to allow +# for Japanese translation. +# + +##### +### This MessageBundle contains English text for ICEpdf View and Pilot RI's +## +# + + +## Window toolbar Title +viewer.window.title.default = ICEpdf Viewer +viewer.window.title.open.default = ICEpdf Viewer - [{0}] + +#status bar +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 + +## 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 + +## 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 + + +## 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 + +## 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 +## 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 + +## 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... + +## 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 +## 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... + +## 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}. + +## 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}\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} \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}\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}\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} \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. + +## 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 + + +## Open URL Dialog +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}? + +## 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. +# Text extraction output file +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 + +## 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} \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 + + +## 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) + + +## 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 + +## Go to Page Dialog +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\ +\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. + +## Utility Pane Bookmarks Tab +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? + +## Utility Pane Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails + +## Layers Pane +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 + +## 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... +## Annotation Tab +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 + +## 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: +## 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: + +## 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: +## 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 + +## 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 + +## 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: +## 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: +## 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 +## 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 +## 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? +## uri action dialog test +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: +## 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 +# 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} + +## 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... +# 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 +# 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 +# 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 + +## 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} + +## 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... + +## 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... +# 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 + +## 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} +# 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 + +## Common Button Labels +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."; + +### +# General Error Messages + + +# Command Line Errors +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. + +# 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. + +### Properties Manager Errors +manager.properties.title = ICEpdf Properties Manager +fontManager.properties.title = ICEpdf Font Manager + +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}\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.readError = \ + Error loading properties file: \n\ + {0} + +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})\n\ +Would you like to merge changes in the file with the current properties? + +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.\n\ + Using system default. + +manager.properties.brokenProperty = Broken default property {0} value: {1} + +manager.properties.missingProperty = Missing default property {0} value: {1} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 0c33d92daf..fd9d2d345e 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -1,3 +1,19 @@ +# Copyright 2014-2020 Basis Technology Corp. +# +# Copyright 2006-2017 ICEsoft Technologies Canada Corp. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an "AS +# IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language +# governing permissions and limitations under the License. +# AnnotationsContentViewer.centralRepositoryEntryDataLabel.case=Case: AnnotationsContentViewer.centralRepositoryEntryDataLabel.comment=Comment: @@ -167,6 +183,17 @@ MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: + +# The following message properties were taken from IcePDF 6.2.2 to allow +# for Japanese translation. +# + +##### +### This MessageBundle contains English text for ICEpdf View and Pilot RI's +## +# + + # {0} - tableName SQLiteViewer.readTable.errorText=Error getting rows for table: {0} # {0} - tableName @@ -175,3 +202,837 @@ TranslatablePanel.comboBoxOption.originalText=Original Text 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}] + +#status bar +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 + +## 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 + +## 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 + + +## 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 + +## 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 +## 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 + +## 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... + +## 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 +## 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... + +## 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}. + +## 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}\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} \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}\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}\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} \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. + +## 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 + + +## Open URL Dialog +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}? + +## 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. +# Text extraction output file +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 + +## 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} \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 + + +## 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) + + +## 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 + +## Go to Page Dialog +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\ +\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. + +## Utility Pane Bookmarks Tab +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? + +## Utility Pane Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails + +## Layers Pane +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 + +## 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... +## Annotation Tab +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 + +## 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: +## 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: + +## 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: +## 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 + +## 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 + +## 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: +## 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: +## 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 +## 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 +## 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? +## uri action dialog test +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: +## 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 +# 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} + +## 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... +# 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 +# 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 +# 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 + +## 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} + +## 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... + +## 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... +# 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 + +## 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} +# 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 + +## Common Button Labels +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."; + +### +# General Error Messages + + +# Command Line Errors +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. + +# 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. + +### Properties Manager Errors +manager.properties.title = ICEpdf Properties Manager +fontManager.properties.title = ICEpdf Font Manager + +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}\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.readError = \ + Error loading properties file: \n\ + {0} + +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})\n\ +Would you like to merge changes in the file with the current properties? + +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.\n\ + Using system default. + +manager.properties.brokenProperty = Broken default property {0} value: {1} + +manager.properties.missingProperty = Missing default property {0} value: {1} diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java index 3ecca358b8..b21a48a193 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java @@ -63,9 +63,11 @@ final class PDFViewer implements FileTypeViewer { private JPanel container; private final PropertiesManager propsManager; + private final ResourceBundle messagesBundle; PDFViewer() { container = createNewContainer(); + messagesBundle = getMessagesBundle(); propsManager = getCustomProperties(); } @@ -77,7 +79,7 @@ final class PDFViewer implements FileTypeViewer { @Override public void setFile(AbstractFile file) { // The 'C' in IcePDFs MVC set up. - SwingController controller = new SwingController(); + SwingController controller = new SwingController(messagesBundle); // Builder for the 'V' in IcePDFs MVC set up SwingViewBuilder viewBuilder = new SwingViewBuilder(controller, propsManager); @@ -181,9 +183,12 @@ final class PDFViewer implements FileTypeViewer { // This suppresses a pop-up, from IcePDF, that asks if you'd like to // save configuration changes to disk. props.setProperty("application.showLocalStorageDialogs", "false"); - - ResourceBundle defaultMessageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE); - return new PropertiesManager(System.getProperties(), props, defaultMessageBundle); + + return new PropertiesManager(System.getProperties(), props, messagesBundle); + } + + private ResourceBundle getMessagesBundle() { + return NbBundle.getBundle(PDFViewer.class); } @NbBundle.Messages({ @@ -207,7 +212,7 @@ final class PDFViewer implements FileTypeViewer { */ private SecurityCallback createPasswordDialogCallback() { // MyGUISecurityCallback is a reference implementation from IcePDF. - return new MyGUISecurityCallback(null, ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE)) { + return new MyGUISecurityCallback(null, messagesBundle) { private String password; @Override From 4ab02220973aefe05d12ce8718d2485462da7763 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Tue, 28 Apr 2020 23:23:40 -0400 Subject: [PATCH 34/35] Added library name --- docs/doxygen-user/drone.dox | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/doxygen-user/drone.dox b/docs/doxygen-user/drone.dox index e237f915e3..dac9bc4cf4 100755 --- a/docs/doxygen-user/drone.dox +++ b/docs/doxygen-user/drone.dox @@ -13,6 +13,8 @@ Currently, the Drone Analyzer module works on images obtained from the internal - Mavic Pro - Mavic Air +The module will find DAT files and process them using DatCon (https://datfile.net/DatCon/intro.html). + \section drone_config Running the Module To enable the Drone Analyzer ingest module select the checkbox in the \ref ingest_configure "Ingest Modules configuration screen". @@ -27,4 +29,4 @@ GPS results can also be seen in the \ref geolocation_page window and the KML Rep \image html geolocation_drone_path.png -*/ \ No newline at end of file +*/ From 85ab00ef0479d4a4ccf4c7c5a796d67deac13bb8 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Wed, 29 Apr 2020 11:39:38 -0400 Subject: [PATCH 35/35] Moved and renamed the result type button for clarity --- .../report/infrastructure/Bundle.properties | 2 +- .../infrastructure/Bundle.properties-MERGED | 2 +- .../infrastructure/ReportVisualPanel2.form | 23 ++++++++++-------- .../infrastructure/ReportVisualPanel2.java | 24 ++++++++++--------- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties index c6f840be32..8d6d7e88a1 100755 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties @@ -18,7 +18,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets: PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results -ReportVisualPanel2.advancedButton.text=Result Types +ReportVisualPanel2.advancedButton.text=Choose Result Types... ReportVisualPanel2.deselectAllButton.text=Deselect All ReportVisualPanel2.selectAllButton.text=Select All ReportVisualPanel2.dataLabel.text=Select which data to report on: diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED index c3bca8db45..7a9c14627a 100755 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED @@ -33,7 +33,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets: PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results -ReportVisualPanel2.advancedButton.text=Result Types +ReportVisualPanel2.advancedButton.text=Choose Result Types... ReportVisualPanel2.deselectAllButton.text=Deselect All ReportVisualPanel2.selectAllButton.text=Select All ReportVisualPanel2.dataLabel.text=Select which data to report on: diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form index 039ef97c70..b54495fb20 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -33,7 +33,6 @@ - @@ -44,8 +43,9 @@ + - + @@ -64,17 +64,20 @@ - - + + - - + + + + + + + - - diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java index e804f0384f..c7dbcfd5b1 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java @@ -321,7 +321,7 @@ final class ReportVisualPanel2 extends JPanel { advancedButton = new javax.swing.JButton(); allTaggedResultsRadioButton = new javax.swing.JRadioButton(); - setPreferredSize(new java.awt.Dimension(650, 250)); + setPreferredSize(new java.awt.Dimension(650, 275)); optionsButtonGroup.add(specificTaggedResultsRadioButton); org.openide.awt.Mnemonics.setLocalizedText(specificTaggedResultsRadioButton, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.specificTaggedResultsRadioButton.text")); // NOI18N @@ -381,7 +381,6 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(tagsScrollPane) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(advancedButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() @@ -389,12 +388,13 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(allTaggedResultsRadioButton) .addComponent(dataLabel) .addComponent(allResultsRadioButton) - .addComponent(specificTaggedResultsRadioButton)) - .addGap(0, 402, Short.MAX_VALUE))) + .addComponent(specificTaggedResultsRadioButton) + .addComponent(advancedButton)) + .addGap(0, 454, Short.MAX_VALUE))) .addContainerGap()) ); - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {advancedButton, deselectAllButton, selectAllButton}); + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deselectAllButton, selectAllButton}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -408,15 +408,17 @@ final class ReportVisualPanel2 extends JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(specificTaggedResultsRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() .addComponent(selectAllButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(deselectAllButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(advancedButton)) - .addComponent(tagsScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGap(136, 136, 136)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(5, 5, 5) + .addComponent(advancedButton) + .addContainerGap()))) ); }// //GEN-END:initComponents