Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 6456-redo-calllogviewer

# Conflicts:
#	Core/src/org/sleuthkit/autopsy/contentviewers/CallLogArtifactViewer.java
This commit is contained in:
Raman Arora 2020-06-15 14:16:27 -04:00
commit c3a6828931
52 changed files with 1068 additions and 300 deletions

View File

@ -252,6 +252,21 @@ public class Persona {
return getPersonaByUUID(uuidStr); return getPersonaByUUID(uuidStr);
} }
/**
* Sets the comment of this persona.
*
* @param name The new comment.
*
* @throws CentralRepoException If there is an error.
*/
public void setComment(String comment) throws CentralRepoException {
String updateClause = "UPDATE personas SET comment = \"" + comment + "\" WHERE id = " + id;
CentralRepository cr = CentralRepository.getInstance();
if (cr != null) {
cr.executeUpdateSQL(updateClause);
}
}
/** /**
* Sets the name of this persona * Sets the name of this persona
* *
@ -261,7 +276,10 @@ public class Persona {
*/ */
public void setName(String name) throws CentralRepoException { public void setName(String name) throws CentralRepoException {
String updateClause = "UPDATE personas SET name = \"" + name + "\" WHERE id = " + id; String updateClause = "UPDATE personas SET name = \"" + name + "\" WHERE id = " + id;
CentralRepository.getInstance().executeUpdateSQL(updateClause); CentralRepository cr = CentralRepository.getInstance();
if (cr != null) {
cr.executeUpdateSQL(updateClause);
}
} }
/** /**
@ -292,12 +310,27 @@ public class Persona {
PersonaAccount.removePersonaAccount(account.getId()); PersonaAccount.removePersonaAccount(account.getId());
} }
/**
* Modifies the confidence / justification of the given PersonaAccount
*
* @param account account to modify
*
* @throws CentralRepoException If there is an error in querying the
* Personas table.
*/
public void modifyAccount(PersonaAccount account, Confidence confidence, String justification) throws CentralRepoException {
PersonaAccount.modifyPersonaAccount(account.getId(), confidence, justification);
}
/** /**
* Marks this persona as deleted * Marks this persona as deleted
*/ */
public void delete() throws CentralRepoException { public void delete() throws CentralRepoException {
String deleteSQL = "UPDATE personas SET status_id = " + PersonaStatus.DELETED.status_id + " WHERE id = " + this.id; String deleteSQL = "UPDATE personas SET status_id = " + PersonaStatus.DELETED.status_id + " WHERE id = " + this.id;
CentralRepository.getInstance().executeUpdateSQL(deleteSQL); CentralRepository cr = CentralRepository.getInstance();
if (cr != null) {
cr.executeDeleteSQL(deleteSQL);
}
} }
/** /**
@ -438,7 +471,7 @@ public class Persona {
} }
/** /**
* Removes the given alias * Removes the given alias.
* *
* @param alias alias to remove * @param alias alias to remove
* *
@ -449,6 +482,18 @@ public class Persona {
PersonaAlias.removePersonaAlias(alias); PersonaAlias.removePersonaAlias(alias);
} }
/**
* Modifies the given alias.
*
* @param alias alias to modify
*
* @throws CentralRepoException If there is an error in querying the
* Personas table.
*/
public void modifyAlias(PersonaAlias key, Confidence confidence, String justification) throws CentralRepoException {
PersonaAlias.modifyPersonaAlias(key, confidence, justification);
}
/** /**
* Gets all aliases for the persona. * Gets all aliases for the persona.
* *
@ -476,7 +521,7 @@ public class Persona {
} }
/** /**
* Removes the given metadata from this persona * Removes the given metadata from this persona.
* *
* @param metadata metadata to remove * @param metadata metadata to remove
* *
@ -487,6 +532,18 @@ public class Persona {
PersonaMetadata.removePersonaMetadata(metadata); PersonaMetadata.removePersonaMetadata(metadata);
} }
/**
* Modifies the given metadata.
*
* @param metadata metadata to modify
*
* @throws CentralRepoException If there is an error in querying the
* Personas table.
*/
public void modifyMetadata(PersonaMetadata key, Confidence confidence, String justification) throws CentralRepoException {
PersonaMetadata.modifyPersonaMetadata(key, confidence, justification);
}
/** /**
* Gets all metadata for the persona. * Gets all metadata for the persona.
* *

View File

@ -364,6 +364,25 @@ public class PersonaAccount {
cr.executeDeleteSQL(deleteClause); cr.executeDeleteSQL(deleteClause);
} }
/**
* Modifies the PersonaAccount row by the given id
*
* @param id row id for the account to be removed
*
* @throws CentralRepoException If there is an error in removing the
* account.
*/
static void modifyPersonaAccount(long id, Persona.Confidence confidence, String justification) throws CentralRepoException {
CentralRepository cr = CentralRepository.getInstance();
if (cr == null) {
throw new CentralRepoException("Failed to modify persona account, Central Repo is not enabled");
}
String updateClause = "UPDATE persona_accounts SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + id;
cr.executeUpdateSQL(updateClause);
}
/** /**
* Callback to process a query that gets all accounts belonging to a * Callback to process a query that gets all accounts belonging to a
* persona. * persona.

View File

@ -144,6 +144,25 @@ public class PersonaAlias {
CentralRepository.getInstance().executeDeleteSQL(deleteClause); CentralRepository.getInstance().executeDeleteSQL(deleteClause);
} }
/**
* Modifies a PesronaAlias.
*
* @param alias Alias to modify.
*
* @throws CentralRepoException If there is an error in modifying the alias.
*/
static void modifyPersonaAlias(PersonaAlias alias, Persona.Confidence confidence, String justification) throws CentralRepoException {
CentralRepository cr = CentralRepository.getInstance();
if (cr == null) {
throw new CentralRepoException("Failed to modify persona alias, Central Repo is not enabled");
}
String updateClause = "UPDATE persona_alias SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + alias.id;
cr.executeUpdateSQL(updateClause);
}
/** /**
* Callback to process a Persona aliases query. * Callback to process a Persona aliases query.
*/ */

View File

@ -155,6 +155,24 @@ public class PersonaMetadata {
CentralRepository.getInstance().executeDeleteSQL(deleteClause); CentralRepository.getInstance().executeDeleteSQL(deleteClause);
} }
/**
* Modifies the given PersonaMetadata
*
* @param metadata Metadata to modify.
*
* @throws CentralRepoException If there is an error in modifying the metadata.
*/
static void modifyPersonaMetadata(PersonaMetadata metadata, Persona.Confidence confidence, String justification) throws CentralRepoException {
CentralRepository cr = CentralRepository.getInstance();
if (cr == null) {
throw new CentralRepoException("Failed to modify persona metadata, Central Repo is not enabled");
}
String updateClause = "UPDATE persona_metadata SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + metadata.id;
cr.executeUpdateSQL(updateClause);
}
/** /**
* Callback to process a Persona metadata query. * Callback to process a Persona metadata query.
*/ */

View File

@ -28,6 +28,24 @@ AddAliasDialog.accountsLbl.text=Account:
AddAliasDialog.okBtn.text=OK AddAliasDialog.okBtn.text=OK
AddAliasDialog.cancelBtn.text=Cancel AddAliasDialog.cancelBtn.text=Cancel
PersonaManagerTopComponent.deleteBtn.text=Delete Persona PersonaManagerTopComponent.deleteBtn.text=Delete Persona
PersonaDetailsPanel.casesLbl.text=Cases found in:
PersonaDetailsPanel.deleteAliasBtn.text=Delete
PersonaDetailsPanel.addAliasBtn.text=Add
PersonaDetailsPanel.aliasesLabel.text=Aliases:
PersonaDetailsPanel.deleteMetadataBtn.text=Delete
PersonaDetailsPanel.addMetadataBtn.text=Add
PersonaDetailsPanel.metadataLabel.text=Metadata:
PersonaDetailsPanel.deleteAccountBtn.text=Delete
PersonaDetailsPanel.addAccountBtn.text=Add
PersonaDetailsPanel.accountsLbl.text=Accounts:
PersonaDetailsPanel.commentField.text=
PersonaDetailsPanel.commentLbl.text=Comment:
PersonaDetailsPanel.nameField.text=
PersonaDetailsPanel.nameLbl.text=Name:
PersonaDetailsPanel.examinerLbl.text=Created by:
PersonaDetailsPanel.examinerField.text=
PersonaDetailsPanel.creationDateLbl.text=Created on:
PersonaDetailsPanel.creationDateField.text=
PersonaAccountDialog.confidenceLbl.text=Confidence: PersonaAccountDialog.confidenceLbl.text=Confidence:
PersonaAccountDialog.justificationTextField.text= PersonaAccountDialog.justificationTextField.text=
PersonaAccountDialog.justificationLbl.text=Justification: PersonaAccountDialog.justificationLbl.text=Justification:
@ -52,3 +70,6 @@ PersonaMetadataDialog.nameTextField.text=
PersonaMetadataDialog.nameLbl.text=Name: PersonaMetadataDialog.nameLbl.text=Name:
PersonaMetadataDialog.okBtn.text=OK PersonaMetadataDialog.okBtn.text=OK
PersonaMetadataDialog.cancelBtn.text=Cancel PersonaMetadataDialog.cancelBtn.text=Cancel
PersonaDetailsPanel.editAccountBtn.text=Edit
PersonaDetailsPanel.editMetadataBtn.text=Edit
PersonaDetailsPanel.editAliasBtn.text=Edit

View File

@ -1,36 +1,42 @@
AddMetadataDialog.title.text=Add Metadata AddMetadataDialog.title.text=Add Metadata
AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona.
AddMetadataDialog_dup_Title=Metadata add failure AddMetadataDialog_dup_Title=Metadata add failure
AddMetadataDialog_empty_name_msg=A metadata entry cannot have an empty name or value.
AddMetadataDialog_empty_name_Title=Missing field(s)
CTL_OpenPersonaManager=Persona Manager CTL_OpenPersonaManager=Persona Manager
CTL_PersonaManagerTopComponentAction=Persona Manager CTL_PersonaManagerTopComponentAction=Persona Manager
CTL_PersonaDetailsTopComponent=Persona Details CTL_PersonaDetailsTopComponent=Persona Details
OpenPersonasAction.displayName=Persona Manager OpenPersonasAction.displayName=Persona Manager
PersonaAccountDialog.title.text=Add Account PersonaAccountDialog.title.text=Add Account
PersonaAccountDialog_dup_msg=This account is already added to the persona PersonaAccountDialog_dup_msg=This account is already added to the persona.
PersonaAccountDialog_dup_Title=Account add failure PersonaAccountDialog_dup_Title=Account add failure
PersonaAccountDialog_get_types_exception_msg=Failed to access central repository PersonaAccountDialog_get_types_exception_msg=Failed to access central repository.
PersonaAccountDialog_get_types_exception_Title=Central Repository failure PersonaAccountDialog_get_types_exception_Title=Central Repository failure
PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty.
PersonaAccountDialog_identifier_empty_Title=Empty identifier PersonaAccountDialog_identifier_empty_Title=Empty identifier
PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type.
PersonaAccountDialog_search_empty_Title=Account not found PersonaAccountDialog_search_empty_Title=Account not found
PersonaAccountDialog_search_failure_msg=Central Repository account search failed PersonaAccountDialog_search_failure_msg=Central Repository account search failed.
PersonaAccountDialog_search_failure_Title=Account add failure PersonaAccountDialog_search_failure_Title=Account add failure
PersonaAliasDialog.title.text=Add Alias PersonaAliasDialog.title.text=Add Alias
PersonaAliasDialog_dup_msg=This alias has already been added to this persona PersonaAliasDialog_dup_msg=This alias has already been added to this persona.
PersonaAliasDialog_dup_Title=Alias add failure PersonaAliasDialog_dup_Title=Alias add failure
PersonaAliasDialog_empty_msg=An alias cannot be empty.
PersonaAliasDialog_empty_Title=Empty alias
PersonaDetailsDialogCreateTitle=Create Persona PersonaDetailsDialogCreateTitle=Create Persona
PersonaDetailsDialogEditTitle=Edit Persona PersonaDetailsDialogEditTitle=Edit Persona
PersonaDetailsDialogViewTitle=View Persona PersonaDetailsDialogViewTitle=View Persona
PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository.
PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure
PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty
PersonaDetailsPanel_empty_justification_Title=Empty justification PersonaDetailsPanel_empty_justification_Title=Empty justification
PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty.
PersonaDetailsPanel_EmptyComment_Title=Empty persona comment
PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty.
PersonaDetailsPanel_EmptyName_Title=Empty persona name PersonaDetailsPanel_EmptyName_Title=Empty persona name
PersonaDetailsPanel_load_exception_msg=Failed to load persona PersonaDetailsPanel_load_exception_msg=Failed to load persona.
PersonaDetailsPanel_load_exception_Title=Initialization failure PersonaDetailsPanel_load_exception_Title=Initialization failure
PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account.
PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account
PersonaManagerTopComponent.createBtn.text=New Persona PersonaManagerTopComponent.createBtn.text=New Persona
PersonaManagerTopComponent.searchBtn.text=Search PersonaManagerTopComponent.searchBtn.text=Search
@ -43,8 +49,6 @@ PersonaManagerTopComponent.searchField.text=
PersonaManagerTopComponent.editBtn.text=Edit Persona PersonaManagerTopComponent.editBtn.text=Edit Persona
PersonaDetailsDialog.cancelBtn.text=Cancel PersonaDetailsDialog.cancelBtn.text=Cancel
PersonaDetailsDialog.okBtn.text=OK PersonaDetailsDialog.okBtn.text=OK
PersonaDetailsPanel.deleteCaseBtn.text=Delete
PersonaDetailsPanel.addCaseBtn.text=Add
PersonaDetailsPanel.casesLbl.text=Cases found in: PersonaDetailsPanel.casesLbl.text=Cases found in:
PersonaDetailsPanel.deleteAliasBtn.text=Delete PersonaDetailsPanel.deleteAliasBtn.text=Delete
PersonaDetailsPanel.addAliasBtn.text=Add PersonaDetailsPanel.addAliasBtn.text=Add
@ -61,6 +65,24 @@ AddAliasDialog.accountsLbl.text=Account:
AddAliasDialog.okBtn.text=OK AddAliasDialog.okBtn.text=OK
AddAliasDialog.cancelBtn.text=Cancel AddAliasDialog.cancelBtn.text=Cancel
PersonaManagerTopComponent.deleteBtn.text=Delete Persona PersonaManagerTopComponent.deleteBtn.text=Delete Persona
PersonaDetailsPanel.casesLbl.text=Cases found in:
PersonaDetailsPanel.deleteAliasBtn.text=Delete
PersonaDetailsPanel.addAliasBtn.text=Add
PersonaDetailsPanel.aliasesLabel.text=Aliases:
PersonaDetailsPanel.deleteMetadataBtn.text=Delete
PersonaDetailsPanel.addMetadataBtn.text=Add
PersonaDetailsPanel.metadataLabel.text=Metadata:
PersonaDetailsPanel.deleteAccountBtn.text=Delete
PersonaDetailsPanel.addAccountBtn.text=Add
PersonaDetailsPanel.accountsLbl.text=Accounts:
PersonaDetailsPanel.commentField.text=
PersonaDetailsPanel.commentLbl.text=Comment:
PersonaDetailsPanel.nameField.text=
PersonaDetailsPanel.nameLbl.text=Name:
PersonaDetailsPanel.examinerLbl.text=Created by:
PersonaDetailsPanel.examinerField.text=
PersonaDetailsPanel.creationDateLbl.text=Created on:
PersonaDetailsPanel.creationDateField.text=
PersonaAccountDialog.confidenceLbl.text=Confidence: PersonaAccountDialog.confidenceLbl.text=Confidence:
PersonaAccountDialog.justificationTextField.text= PersonaAccountDialog.justificationTextField.text=
PersonaAccountDialog.justificationLbl.text=Justification: PersonaAccountDialog.justificationLbl.text=Justification:
@ -85,8 +107,13 @@ PersonaMetadataDialog.nameTextField.text=
PersonaMetadataDialog.nameLbl.text=Name: PersonaMetadataDialog.nameLbl.text=Name:
PersonaMetadataDialog.okBtn.text=OK PersonaMetadataDialog.okBtn.text=OK
PersonaMetadataDialog.cancelBtn.text=Cancel PersonaMetadataDialog.cancelBtn.text=Cancel
PMTopComponent_delete_exception_msg=Failed to delete persona PersonaDetailsPanel.editAccountBtn.text=Edit
PersonaDetailsPanel.editMetadataBtn.text=Edit
PersonaDetailsPanel.editAliasBtn.text=Edit
PMTopComponent_delete_confirmation_msg=Are you sure you want to delete this persona?
PMTopComponent_delete_confirmation_Title=Are you sure?
PMTopComponent_delete_exception_msg=Failed to delete persona.
PMTopComponent_delete_exception_Title=Delete failure PMTopComponent_delete_exception_Title=Delete failure
PMTopComponent_Name=Persona Manager PMTopComponent_Name=Persona Manager
PMTopComponent_search_exception_msg=Failed to search personas PMTopComponent_search_exception_msg=Failed to search personas.
PMTopComponent_search_exception_Title=Search failure PMTopComponent_search_exception_Title=Search failure

View File

@ -23,11 +23,11 @@ import java.io.Serializable;
import java.util.Collection; import java.util.Collection;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.ListCellRenderer; import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.openide.windows.WindowManager; import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
@ -50,14 +50,16 @@ public class PersonaAccountDialog extends JDialog {
private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer(); private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer();
private final PersonaDetailsPanel pdp; private final PersonaDetailsPanel pdp;
private PersonaDetailsPanel.PAccount currentAccount = null;
/** /**
* Creates new add account dialog * Creates new add account dialog
*/ */
@Messages({"PersonaAccountDialog.title.text=Add Account",}) @Messages({"PersonaAccountDialog.title.text=Add Account",})
public PersonaAccountDialog(PersonaDetailsPanel pdp) { public PersonaAccountDialog(PersonaDetailsPanel pdp) {
super((JFrame) WindowManager.getDefault().getMainWindow(), super(SwingUtilities.windowForComponent(pdp),
Bundle.PersonaAccountDialog_title_text(), Bundle.PersonaAccountDialog_title_text(),
true); ModalityType.APPLICATION_MODAL);
this.pdp = pdp; this.pdp = pdp;
initComponents(); initComponents();
@ -65,8 +67,29 @@ public class PersonaAccountDialog extends JDialog {
display(); display();
} }
PersonaAccountDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PAccount acc) {
super(SwingUtilities.windowForComponent(pdp),
Bundle.PersonaAccountDialog_title_text(),
ModalityType.APPLICATION_MODAL);
this.pdp = pdp;
initComponents();
currentAccount = acc;
confidenceComboBox.setSelectedItem(acc.confidence);
justificationTextField.setText(acc.justification);
typeComboBox.setSelectedItem(acc.account.getAccountType());
identifierTextField.setText(acc.account.getIdentifier());
typeComboBox.setEnabled(false);
identifierTextField.setEnabled(false);
typeComboBox.setRenderer(TYPE_CHOICE_RENDERER);
display();
}
/** /**
* This class handles displaying and rendering drop down menu for account choices * This class handles displaying and rendering drop down menu for account
* choices
*/ */
private class TypeChoiceRenderer extends JLabel implements ListCellRenderer<CentralRepoAccountType>, Serializable { private class TypeChoiceRenderer extends JLabel implements ListCellRenderer<CentralRepoAccountType>, Serializable {
@ -83,8 +106,7 @@ public class PersonaAccountDialog extends JDialog {
@Messages({ @Messages({
"PersonaAccountDialog_get_types_exception_Title=Central Repository failure", "PersonaAccountDialog_get_types_exception_Title=Central Repository failure",
"PersonaAccountDialog_get_types_exception_msg=Failed to access central repository.", "PersonaAccountDialog_get_types_exception_msg=Failed to access central repository.",})
})
private CentralRepoAccountType[] getAllAccountTypes() { private CentralRepoAccountType[] getAllAccountTypes() {
Collection<CentralRepoAccountType> allAccountTypes; Collection<CentralRepoAccountType> allAccountTypes;
try { try {
@ -304,10 +326,15 @@ public class PersonaAccountDialog extends JDialog {
return; return;
} }
if (pdp.addAccount( Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
result, String justification = justificationTextField.getText();
justificationTextField.getText(),
(Persona.Confidence) confidenceComboBox.getSelectedItem())) { if (currentAccount != null) {
currentAccount.confidence = confidence;
currentAccount.justification = justification;
dispose();
} else {
if (pdp.addAccount(result, justification, confidence)) {
dispose(); dispose();
} else { } else {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
@ -315,6 +342,7 @@ public class PersonaAccountDialog extends JDialog {
Bundle.PersonaAccountDialog_dup_Title(), Bundle.PersonaAccountDialog_dup_Title(),
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
} }
}
}//GEN-LAST:event_okBtnActionPerformed }//GEN-LAST:event_okBtnActionPerformed
private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed

View File

@ -19,8 +19,8 @@
package org.sleuthkit.autopsy.centralrepository.persona; package org.sleuthkit.autopsy.centralrepository.persona;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.openide.windows.WindowManager; import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
@ -35,20 +35,39 @@ public class PersonaAliasDialog extends JDialog {
private final PersonaDetailsPanel pdp; private final PersonaDetailsPanel pdp;
private PersonaDetailsPanel.PAlias currentAlias = null;
/** /**
* Creates new add alias dialog * Creates new add alias dialog
*/ */
@Messages({"PersonaAliasDialog.title.text=Add Alias",}) @Messages({"PersonaAliasDialog.title.text=Add Alias",})
public PersonaAliasDialog(PersonaDetailsPanel pdp) { public PersonaAliasDialog(PersonaDetailsPanel pdp) {
super((JFrame) WindowManager.getDefault().getMainWindow(), super(SwingUtilities.windowForComponent(pdp),
Bundle.PersonaAliasDialog_title_text(), Bundle.PersonaAliasDialog_title_text(),
true); ModalityType.APPLICATION_MODAL);
this.pdp = pdp; this.pdp = pdp;
initComponents(); initComponents();
display(); display();
} }
PersonaAliasDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PAlias pa) {
super(SwingUtilities.windowForComponent(pdp),
Bundle.PersonaAliasDialog_title_text(),
ModalityType.APPLICATION_MODAL);
this.pdp = pdp;
initComponents();
currentAlias = pa;
confidenceComboBox.setSelectedItem(pa.confidence);
justificationTextField.setText(pa.justification);
aliasTextField.setText(pa.alias);
aliasTextField.setEnabled(false);
display();
}
/** /**
* This method is called from within the constructor to initialize the form. * This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always * WARNING: Do NOT modify this code. The content of this method is always
@ -176,9 +195,18 @@ public class PersonaAliasDialog extends JDialog {
} }
@Messages({ @Messages({
"PersonaAliasDialog_empty_Title=Empty alias",
"PersonaAliasDialog_empty_msg=An alias cannot be empty.",
"PersonaAliasDialog_dup_Title=Alias add failure", "PersonaAliasDialog_dup_Title=Alias add failure",
"PersonaAliasDialog_dup_msg=This alias has already been added to this persona",}) "PersonaAliasDialog_dup_msg=This alias has already been added to this persona.",})
private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed
if (aliasTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this,
Bundle.PersonaAliasDialog_empty_msg(),
Bundle.PersonaAliasDialog_empty_Title(),
JOptionPane.ERROR_MESSAGE);
return;
}
if (justificationTextField.getText().isEmpty()) { if (justificationTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
Bundle.PersonaDetailsPanel_empty_justification_msg(), Bundle.PersonaDetailsPanel_empty_justification_msg(),
@ -186,10 +214,16 @@ public class PersonaAliasDialog extends JDialog {
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return; return;
} }
if (pdp.addAlias(
aliasTextField.getText(), Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
justificationTextField.getText(), String justification = justificationTextField.getText();
(Persona.Confidence) confidenceComboBox.getSelectedItem())) {
if (currentAlias != null) {
currentAlias.confidence = confidence;
currentAlias.justification = justification;
dispose();
} else {
if (pdp.addAlias(aliasTextField.getText(), justification, confidence)) {
dispose(); dispose();
} else { } else {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
@ -197,6 +231,7 @@ public class PersonaAliasDialog extends JDialog {
Bundle.PersonaAliasDialog_dup_Title(), Bundle.PersonaAliasDialog_dup_Title(),
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
} }
}
}//GEN-LAST:event_okBtnActionPerformed }//GEN-LAST:event_okBtnActionPerformed
private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed

View File

@ -37,9 +37,9 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="561" max="32767" attributes="0"/> <Component id="detailsPanel" alignment="1" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> <Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Component id="detailsPanel" alignment="0" max="32767" attributes="0"/> <EmptySpace min="0" pref="617" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -64,12 +64,7 @@
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="accountsTablePane" alignment="1" pref="549" max="32767" attributes="0"/> <Component id="accountsTablePane" alignment="1" pref="605" max="32767" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="nameLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="nameField" max="32767" attributes="0"/>
</Group>
<Component id="accountsLbl" alignment="0" max="32767" attributes="0"/> <Component id="accountsLbl" alignment="0" max="32767" attributes="0"/>
<Component id="metadataLabel" alignment="0" max="32767" attributes="0"/> <Component id="metadataLabel" alignment="0" max="32767" attributes="0"/>
<Component id="metadataTablePane" alignment="1" max="32767" attributes="0"/> <Component id="metadataTablePane" alignment="1" max="32767" attributes="0"/>
@ -77,26 +72,51 @@
<Component id="aliasesTablePane" alignment="0" max="32767" attributes="0"/> <Component id="aliasesTablePane" alignment="0" max="32767" attributes="0"/>
<Component id="casesLbl" alignment="0" max="32767" attributes="0"/> <Component id="casesLbl" alignment="0" max="32767" attributes="0"/>
<Component id="casesTablePane" max="32767" attributes="0"/> <Component id="casesTablePane" max="32767" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="commentLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="commentField" max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="nameLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="nameField" max="32767" attributes="0"/>
</Group>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="addAccountBtn" min="-2" max="-2" attributes="0"/> <Component id="addAccountBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="editAccountBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="deleteAccountBtn" min="-2" max="-2" attributes="0"/> <Component id="deleteAccountBtn" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="addMetadataBtn" min="-2" max="-2" attributes="0"/> <Component id="addMetadataBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="editMetadataBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="deleteMetadataBtn" min="-2" max="-2" attributes="0"/> <Component id="deleteMetadataBtn" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="addAliasBtn" min="-2" max="-2" attributes="0"/> <Component id="addAliasBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="editAliasBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="deleteAliasBtn" min="-2" max="-2" attributes="0"/> <Component id="deleteAliasBtn" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/> <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0">
<Component id="examinerLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="examinerField" min="-2" pref="161" max="-2" attributes="0"/>
<EmptySpace type="separate" min="-2" max="-2" attributes="0"/>
<Component id="creationDateLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="creationDateField" max="32767" attributes="0"/>
</Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
@ -105,7 +125,19 @@
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="examinerLbl" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="examinerField" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="creationDateLbl" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="creationDateField" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="commentField" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="commentLbl" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="nameLbl" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="nameLbl" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/>
@ -118,35 +150,83 @@
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="addAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="addAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deleteAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="deleteAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="editAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="metadataLabel" min="-2" max="-2" attributes="0"/> <Component id="metadataLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="metadataTablePane" min="-2" pref="66" max="-2" attributes="0"/> <Component id="metadataTablePane" min="-2" pref="66" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="deleteMetadataBtn" min="-2" max="-2" attributes="0"/> <Component id="addMetadataBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="addMetadataBtn" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="deleteMetadataBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="editMetadataBtn" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="aliasesLabel" min="-2" max="-2" attributes="0"/> <Component id="aliasesLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="aliasesTablePane" min="-2" pref="74" max="-2" attributes="0"/> <Component id="aliasesTablePane" min="-2" pref="74" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="deleteAliasBtn" min="-2" max="-2" attributes="0"/> <Component id="addAliasBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="addAliasBtn" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="deleteAliasBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="editAliasBtn" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="casesLbl" min="-2" max="-2" attributes="0"/> <Component id="casesLbl" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="casesTablePane" min="-2" pref="63" max="-2" attributes="0"/> <Component id="casesTablePane" min="-2" pref="63" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Component class="javax.swing.JLabel" name="examinerLbl">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.examinerLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="examinerField">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.examinerField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="creationDateLbl">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.creationDateLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="creationDateField">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.creationDateField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="commentLbl">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.commentLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="commentField">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.commentField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="nameLbl"> <Component class="javax.swing.JLabel" name="nameLbl">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
@ -161,9 +241,6 @@
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.nameField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.nameField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
</Properties> </Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nameFieldActionPerformed"/>
</Events>
</Component> </Component>
<Component class="javax.swing.JLabel" name="accountsLbl"> <Component class="javax.swing.JLabel" name="accountsLbl">
<Properties> <Properties>
@ -196,6 +273,14 @@
<Property name="enabled" type="boolean" value="false"/> <Property name="enabled" type="boolean" value="false"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JButton" name="editAccountBtn">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.editAccountBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="deleteAccountBtn"> <Component class="javax.swing.JButton" name="deleteAccountBtn">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
@ -235,6 +320,14 @@
<Property name="enabled" type="boolean" value="false"/> <Property name="enabled" type="boolean" value="false"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JButton" name="editMetadataBtn">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.editMetadataBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="deleteMetadataBtn"> <Component class="javax.swing.JButton" name="deleteMetadataBtn">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
@ -274,6 +367,14 @@
<Property name="enabled" type="boolean" value="false"/> <Property name="enabled" type="boolean" value="false"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JButton" name="editAliasBtn">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.editAliasBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="deleteAliasBtn"> <Component class="javax.swing.JButton" name="deleteAliasBtn">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">

View File

@ -20,9 +20,13 @@ package org.sleuthkit.autopsy.centralrepository.persona;
import java.awt.Component; import java.awt.Component;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@ -34,7 +38,9 @@ import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.openide.windows.RetainLocation; import org.openide.windows.RetainLocation;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoExaminer;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount;
@ -65,6 +71,10 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
private final List<PersonaMetadata> metadataToRemove = new ArrayList<>(); private final List<PersonaMetadata> metadataToRemove = new ArrayList<>();
private final List<PersonaAlias> aliasesToRemove = new ArrayList<>(); private final List<PersonaAlias> aliasesToRemove = new ArrayList<>();
private final Map<PersonaAccount, PAccount> accountsToEdit = new HashMap<>();
private final Map<PersonaMetadata, PMetadata> metadataToEdit = new HashMap<>();
private final Map<PersonaAlias, PAlias> aliasesToEdit = new HashMap<>();
private Persona currentPersona; private Persona currentPersona;
private List<PersonaAccount> currentAccounts = new ArrayList<>(); private List<PersonaAccount> currentAccounts = new ArrayList<>();
private List<PersonaMetadata> currentMetadata = new ArrayList<>(); private List<PersonaMetadata> currentMetadata = new ArrayList<>();
@ -87,6 +97,19 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
addAccountBtn.addActionListener((ActionEvent e) -> { addAccountBtn.addActionListener((ActionEvent e) -> {
new PersonaAccountDialog(this); new PersonaAccountDialog(this);
}); });
editAccountBtn.addActionListener((ActionEvent e) -> {
int selectedRow = accountsTable.getSelectedRow();
if (selectedRow != -1) {
if (selectedRow >= currentAccounts.size()) {
PAccount acc = accountsToAdd.get(selectedRow - currentAccounts.size());
new PersonaAccountDialog(this, acc);
} else {
PersonaAccount personaAccount = currentAccounts.get(selectedRow);
accountsToEdit.putIfAbsent(personaAccount, new PAccount(personaAccount.getAccount(), personaAccount.getJustification(), personaAccount.getConfidence()));
new PersonaAccountDialog(this, accountsToEdit.get(personaAccount));
}
}
});
deleteAccountBtn.addActionListener((ActionEvent e) -> { deleteAccountBtn.addActionListener((ActionEvent e) -> {
int selectedRow = accountsTable.getSelectedRow(); int selectedRow = accountsTable.getSelectedRow();
if (selectedRow != -1) { if (selectedRow != -1) {
@ -94,21 +117,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
if (selectedRow >= currentAccounts.size()) { if (selectedRow >= currentAccounts.size()) {
accountsToAdd.remove(selectedRow - currentAccounts.size()); accountsToAdd.remove(selectedRow - currentAccounts.size());
} else { } else {
accountsToRemove.add(currentAccounts.get(selectedRow)); PersonaAccount toRemove = currentAccounts.get(selectedRow);
currentAccounts.remove(selectedRow); accountsToEdit.remove(toRemove);
accountsToRemove.add(toRemove);
currentAccounts.remove(toRemove);
} }
updateAccountsTable(); updateAccountsTable();
} }
}); });
accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
handleSelectionChange(e, deleteAccountBtn, accountsTable); handleSelectionChange(e, editAccountBtn, deleteAccountBtn, accountsTable);
}); });
// Metadata // Metadata
addMetadataBtn.addActionListener((ActionEvent e) -> { addMetadataBtn.addActionListener((ActionEvent e) -> {
new PersonaMetadataDialog(this); new PersonaMetadataDialog(this);
}); });
editMetadataBtn.addActionListener((ActionEvent e) -> {
int selectedRow = metadataTable.getSelectedRow();
if (selectedRow != -1) {
if (selectedRow >= currentMetadata.size()) {
PMetadata md = metadataToAdd.get(selectedRow - currentMetadata.size());
new PersonaMetadataDialog(this, md);
} else {
PersonaMetadata personaMetadata = currentMetadata.get(selectedRow);
metadataToEdit.putIfAbsent(personaMetadata, new PMetadata(personaMetadata.getName(), personaMetadata.getValue(), personaMetadata.getJustification(), personaMetadata.getConfidence()));
new PersonaMetadataDialog(this, metadataToEdit.get(personaMetadata));
}
}
});
deleteMetadataBtn.addActionListener((ActionEvent e) -> { deleteMetadataBtn.addActionListener((ActionEvent e) -> {
int selectedRow = metadataTable.getSelectedRow(); int selectedRow = metadataTable.getSelectedRow();
if (selectedRow != -1) { if (selectedRow != -1) {
@ -116,21 +154,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
if (selectedRow >= currentMetadata.size()) { if (selectedRow >= currentMetadata.size()) {
metadataToAdd.remove(selectedRow - currentMetadata.size()); metadataToAdd.remove(selectedRow - currentMetadata.size());
} else { } else {
metadataToRemove.add(currentMetadata.get(selectedRow)); PersonaMetadata toRemove = currentMetadata.get(selectedRow);
currentMetadata.remove(selectedRow); metadataToEdit.remove(toRemove);
metadataToRemove.add(toRemove);
currentMetadata.remove(toRemove);
} }
updateMetadataTable(); updateMetadataTable();
} }
}); });
metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
handleSelectionChange(e, deleteMetadataBtn, metadataTable); handleSelectionChange(e, editMetadataBtn, deleteMetadataBtn, metadataTable);
}); });
// Aliases // Aliases
addAliasBtn.addActionListener((ActionEvent e) -> { addAliasBtn.addActionListener((ActionEvent e) -> {
new PersonaAliasDialog(this); new PersonaAliasDialog(this);
}); });
editAliasBtn.addActionListener((ActionEvent e) -> {
int selectedRow = aliasesTable.getSelectedRow();
if (selectedRow != -1) {
if (selectedRow >= currentAliases.size()) {
PAlias pa = aliasesToAdd.get(selectedRow - currentAliases.size());
new PersonaAliasDialog(this, pa);
} else {
PersonaAlias personaAlias = currentAliases.get(selectedRow);
aliasesToEdit.putIfAbsent(personaAlias, new PAlias(personaAlias.getAlias(), personaAlias.getJustification(), personaAlias.getConfidence()));
new PersonaAliasDialog(this, aliasesToEdit.get(personaAlias));
}
}
});
deleteAliasBtn.addActionListener((ActionEvent e) -> { deleteAliasBtn.addActionListener((ActionEvent e) -> {
int selectedRow = aliasesTable.getSelectedRow(); int selectedRow = aliasesTable.getSelectedRow();
if (selectedRow != -1) { if (selectedRow != -1) {
@ -138,33 +191,48 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
if (selectedRow >= currentAliases.size()) { if (selectedRow >= currentAliases.size()) {
aliasesToAdd.remove(selectedRow - currentAliases.size()); aliasesToAdd.remove(selectedRow - currentAliases.size());
} else { } else {
aliasesToRemove.add(currentAliases.get(selectedRow)); PersonaAlias toRemove = currentAliases.get(selectedRow);
currentAliases.remove(selectedRow); aliasesToEdit.remove(toRemove);
aliasesToRemove.add(toRemove);
currentAliases.remove(toRemove);
} }
updateAliasesTable(); updateAliasesTable();
} }
}); });
aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
aliasesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { aliasesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
handleSelectionChange(e, deleteAliasBtn, aliasesTable); handleSelectionChange(e, editAliasBtn, deleteAliasBtn, aliasesTable);
}); });
} }
private void handleSelectionChange(ListSelectionEvent e, JButton btn, JTable table) { private void handleSelectionChange(ListSelectionEvent e, JButton editBtn, JButton deleteBtn, JTable table) {
if (e.getValueIsAdjusting()) { if (e.getValueIsAdjusting()) {
return; return;
} }
btn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1); editBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1);
deleteBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1);
}
void addEditExistingAccount(PersonaAccount account, String justification, Persona.Confidence confidence) {
accountsToEdit.put(account, new PAccount(account.getAccount(), justification, confidence));
}
void addEditExistingMetadata(PersonaMetadata metadata, String justification, Persona.Confidence confidence) {
metadataToEdit.put(metadata, new PMetadata(metadata.getName(), metadata.getValue(), justification, confidence));
}
void addEditExistingAlias(PersonaAlias alias, String justification, Persona.Confidence confidence) {
aliasesToEdit.put(alias, new PAlias(alias.getAlias(), justification, confidence));
} }
/** /**
* A data bucket class for yet-to-be-created PersonaAccount * A data bucket class for yet-to-be-created PersonaAccount
*/ */
private class PAccount { class PAccount {
private final CentralRepoAccount account; CentralRepoAccount account;
private final String justification; String justification;
private final Persona.Confidence confidence; Persona.Confidence confidence;
PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) { PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
this.account = account; this.account = account;
@ -199,12 +267,12 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
/** /**
* A data bucket class for yet-to-be-created PersonaMetadata * A data bucket class for yet-to-be-created PersonaMetadata
*/ */
private class PMetadata { class PMetadata {
private final String name; String name;
private final String value; String value;
private final String justification; String justification;
private final Persona.Confidence confidence; Persona.Confidence confidence;
PMetadata(String name, String value, String justification, Persona.Confidence confidence) { PMetadata(String name, String value, String justification, Persona.Confidence confidence) {
this.name = name; this.name = name;
@ -240,11 +308,11 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
/** /**
* A data bucket class for yet-to-be-created PersonaAlias * A data bucket class for yet-to-be-created PersonaAlias
*/ */
private class PAlias { class PAlias {
private final String alias; String alias;
private final String justification; String justification;
private final Persona.Confidence confidence; Persona.Confidence confidence;
PAlias(String alias, String justification, Persona.Confidence confidence) { PAlias(String alias, String justification, Persona.Confidence confidence) {
this.alias = alias; this.alias = alias;
@ -285,36 +353,55 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
private void initComponents() { private void initComponents() {
detailsPanel = new javax.swing.JPanel(); detailsPanel = new javax.swing.JPanel();
examinerLbl = new javax.swing.JLabel();
examinerField = new javax.swing.JTextField();
creationDateLbl = new javax.swing.JLabel();
creationDateField = new javax.swing.JTextField();
commentLbl = new javax.swing.JLabel();
commentField = new javax.swing.JTextField();
nameLbl = new javax.swing.JLabel(); nameLbl = new javax.swing.JLabel();
nameField = new javax.swing.JTextField(); nameField = new javax.swing.JTextField();
accountsLbl = new javax.swing.JLabel(); accountsLbl = new javax.swing.JLabel();
accountsTablePane = new javax.swing.JScrollPane(); accountsTablePane = new javax.swing.JScrollPane();
accountsTable = new javax.swing.JTable(); accountsTable = new javax.swing.JTable();
addAccountBtn = new javax.swing.JButton(); addAccountBtn = new javax.swing.JButton();
editAccountBtn = new javax.swing.JButton();
deleteAccountBtn = new javax.swing.JButton(); deleteAccountBtn = new javax.swing.JButton();
metadataLabel = new javax.swing.JLabel(); metadataLabel = new javax.swing.JLabel();
metadataTablePane = new javax.swing.JScrollPane(); metadataTablePane = new javax.swing.JScrollPane();
metadataTable = new javax.swing.JTable(); metadataTable = new javax.swing.JTable();
addMetadataBtn = new javax.swing.JButton(); addMetadataBtn = new javax.swing.JButton();
editMetadataBtn = new javax.swing.JButton();
deleteMetadataBtn = new javax.swing.JButton(); deleteMetadataBtn = new javax.swing.JButton();
aliasesLabel = new javax.swing.JLabel(); aliasesLabel = new javax.swing.JLabel();
aliasesTablePane = new javax.swing.JScrollPane(); aliasesTablePane = new javax.swing.JScrollPane();
aliasesTable = new javax.swing.JTable(); aliasesTable = new javax.swing.JTable();
addAliasBtn = new javax.swing.JButton(); addAliasBtn = new javax.swing.JButton();
editAliasBtn = new javax.swing.JButton();
deleteAliasBtn = new javax.swing.JButton(); deleteAliasBtn = new javax.swing.JButton();
casesLbl = new javax.swing.JLabel(); casesLbl = new javax.swing.JLabel();
casesTablePane = new javax.swing.JScrollPane(); casesTablePane = new javax.swing.JScrollPane();
casesTable = new javax.swing.JTable(); casesTable = new javax.swing.JTable();
org.openide.awt.Mnemonics.setLocalizedText(examinerLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerLbl.text")); // NOI18N
examinerField.setEditable(false);
examinerField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerField.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(creationDateLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateLbl.text")); // NOI18N
creationDateField.setEditable(false);
creationDateField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateField.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(commentLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentLbl.text")); // NOI18N
commentField.setEditable(false);
commentField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentField.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N
nameField.setEditable(false); nameField.setEditable(false);
nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N
nameField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nameFieldActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N
@ -334,6 +421,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N
addAccountBtn.setEnabled(false); addAccountBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(editAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAccountBtn.text")); // NOI18N
editAccountBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N
deleteAccountBtn.setEnabled(false); deleteAccountBtn.setEnabled(false);
@ -355,6 +445,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N
addMetadataBtn.setEnabled(false); addMetadataBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(editMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editMetadataBtn.text")); // NOI18N
editMetadataBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N
deleteMetadataBtn.setEnabled(false); deleteMetadataBtn.setEnabled(false);
@ -376,6 +469,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N
addAliasBtn.setEnabled(false); addAliasBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(editAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAliasBtn.text")); // NOI18N
editAliasBtn.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N
deleteAliasBtn.setEnabled(false); deleteAliasBtn.setEnabled(false);
@ -401,11 +497,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE) .addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 605, Short.MAX_VALUE)
.addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(nameLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(nameField))
.addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING)
@ -413,27 +505,59 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
.addComponent(aliasesTablePane) .addComponent(aliasesTablePane)
.addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(casesTablePane) .addComponent(casesTablePane)
.addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(commentLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(commentField))
.addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(nameLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(nameField))
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(addAccountBtn) .addComponent(addAccountBtn)
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addComponent(editAccountBtn)
.addGap(18, 18, 18)
.addComponent(deleteAccountBtn)) .addComponent(deleteAccountBtn))
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(addMetadataBtn) .addComponent(addMetadataBtn)
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addComponent(editMetadataBtn)
.addGap(18, 18, 18)
.addComponent(deleteMetadataBtn)) .addComponent(deleteMetadataBtn))
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(addAliasBtn) .addComponent(addAliasBtn)
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addComponent(editAliasBtn)
.addGap(18, 18, 18)
.addComponent(deleteAliasBtn))) .addComponent(deleteAliasBtn)))
.addGap(0, 0, Short.MAX_VALUE))) .addGap(0, 0, Short.MAX_VALUE))
.addGroup(detailsPanelLayout.createSequentialGroup()
.addComponent(examinerLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(creationDateLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(creationDateField)))
.addContainerGap()) .addContainerGap())
); );
detailsPanelLayout.setVerticalGroup( detailsPanelLayout.setVerticalGroup(
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(examinerLbl)
.addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(creationDateLbl)
.addComponent(creationDateField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(commentField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(commentLbl))
.addGap(20, 20, 20)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(nameLbl) .addComponent(nameLbl)
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
@ -444,37 +568,40 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addAccountBtn) .addComponent(addAccountBtn)
.addComponent(deleteAccountBtn)) .addComponent(deleteAccountBtn)
.addComponent(editAccountBtn))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(metadataLabel) .addComponent(metadataLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addMetadataBtn)
.addComponent(deleteMetadataBtn) .addComponent(deleteMetadataBtn)
.addComponent(addMetadataBtn)) .addComponent(editMetadataBtn))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(aliasesLabel) .addComponent(aliasesLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addAliasBtn)
.addComponent(deleteAliasBtn) .addComponent(deleteAliasBtn)
.addComponent(addAliasBtn)) .addComponent(editAliasBtn))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(casesLbl) .addComponent(casesLbl)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap())
); );
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 561, Short.MAX_VALUE) .addComponent(detailsPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 617, Short.MAX_VALUE))
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -486,10 +613,6 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
private void nameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed
}//GEN-LAST:event_nameFieldActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel accountsLbl; private javax.swing.JLabel accountsLbl;
private javax.swing.JTable accountsTable; private javax.swing.JTable accountsTable;
@ -503,10 +626,19 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
private javax.swing.JLabel casesLbl; private javax.swing.JLabel casesLbl;
private javax.swing.JTable casesTable; private javax.swing.JTable casesTable;
private javax.swing.JScrollPane casesTablePane; private javax.swing.JScrollPane casesTablePane;
private javax.swing.JTextField commentField;
private javax.swing.JLabel commentLbl;
private javax.swing.JTextField creationDateField;
private javax.swing.JLabel creationDateLbl;
private javax.swing.JButton deleteAccountBtn; private javax.swing.JButton deleteAccountBtn;
private javax.swing.JButton deleteAliasBtn; private javax.swing.JButton deleteAliasBtn;
private javax.swing.JButton deleteMetadataBtn; private javax.swing.JButton deleteMetadataBtn;
private javax.swing.JPanel detailsPanel; private javax.swing.JPanel detailsPanel;
private javax.swing.JButton editAccountBtn;
private javax.swing.JButton editAliasBtn;
private javax.swing.JButton editMetadataBtn;
private javax.swing.JTextField examinerField;
private javax.swing.JLabel examinerLbl;
private javax.swing.JLabel metadataLabel; private javax.swing.JLabel metadataLabel;
private javax.swing.JTable metadataTable; private javax.swing.JTable metadataTable;
private javax.swing.JScrollPane metadataTablePane; private javax.swing.JScrollPane metadataTablePane;
@ -516,14 +648,24 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
@Messages({ @Messages({
"PersonaDetailsPanel_load_exception_Title=Initialization failure", "PersonaDetailsPanel_load_exception_Title=Initialization failure",
"PersonaDetailsPanel_load_exception_msg=Failed to load persona",}) "PersonaDetailsPanel_load_exception_msg=Failed to load persona.",})
private void loadPersona(Component parent, Persona persona) { private void loadPersona(Component parent, Persona persona) {
String examiner;
String creationDate;
String comment;
String name; String name;
Collection<PersonaAccount> accounts; Collection<PersonaAccount> accounts;
Collection<PersonaMetadata> metadata; Collection<PersonaMetadata> metadata;
Collection<PersonaAlias> aliases; Collection<PersonaAlias> aliases;
Collection<CorrelationCase> cases; Collection<CorrelationCase> cases;
try { try {
examiner = persona.getExaminer().getLoginName();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date cDate = new Date(persona.getCreatedDate());
creationDate = dateFormat.format(cDate);
comment = persona.getComment();
name = persona.getName(); name = persona.getName();
accounts = persona.getPersonaAccounts(); accounts = persona.getPersonaAccounts();
metadata = persona.getMetadata(); metadata = persona.getMetadata();
@ -538,6 +680,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
return; return;
} }
this.currentPersona = persona; this.currentPersona = persona;
this.examinerField.setText(examiner);
this.creationDateField.setText(creationDate);
this.commentField.setText(comment);
this.nameField.setText(name); this.nameField.setText(name);
this.currentAccounts.addAll(accounts); this.currentAccounts.addAll(accounts);
this.currentMetadata.addAll(metadata); this.currentMetadata.addAll(metadata);
@ -547,6 +692,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
void clear() { void clear() {
currentPersona = null; currentPersona = null;
examinerField.setText("");
creationDateField.setText("");
commentField.setText("");
nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : ""); nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : "");
currentAccounts = new ArrayList<>(); currentAccounts = new ArrayList<>();
currentMetadata = new ArrayList<>(); currentMetadata = new ArrayList<>();
@ -556,6 +704,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
metadataToAdd.clear(); metadataToAdd.clear();
aliasesToAdd.clear(); aliasesToAdd.clear();
nameField.setEditable(false); nameField.setEditable(false);
commentField.setEditable(false);
initializeFields(); initializeFields();
@ -565,6 +714,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
deleteAccountBtn.setEnabled(false); deleteAccountBtn.setEnabled(false);
deleteMetadataBtn.setEnabled(false); deleteMetadataBtn.setEnabled(false);
deleteAliasBtn.setEnabled(false); deleteAliasBtn.setEnabled(false);
editAccountBtn.setEnabled(false);
editMetadataBtn.setEnabled(false);
editAliasBtn.setEnabled(false);
} }
/** /**
@ -663,20 +815,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
} }
void configureEditComponents(boolean enabled) { void configureEditComponents(boolean enabled) {
commentField.setEditable(enabled);
nameField.setEditable(enabled); nameField.setEditable(enabled);
addAccountBtn.setEnabled(enabled); addAccountBtn.setEnabled(enabled);
addMetadataBtn.setEnabled(enabled); addMetadataBtn.setEnabled(enabled);
addAliasBtn.setEnabled(enabled); addAliasBtn.setEnabled(enabled);
addAccountBtn.setVisible(enabled); addAccountBtn.setVisible(enabled);
editAccountBtn.setVisible(enabled);
deleteAccountBtn.setVisible(enabled); deleteAccountBtn.setVisible(enabled);
addMetadataBtn.setVisible(enabled); addMetadataBtn.setVisible(enabled);
editMetadataBtn.setVisible(enabled);
deleteMetadataBtn.setVisible(enabled); deleteMetadataBtn.setVisible(enabled);
addAliasBtn.setVisible(enabled); addAliasBtn.setVisible(enabled);
editAliasBtn.setVisible(enabled);
deleteAliasBtn.setVisible(enabled); deleteAliasBtn.setVisible(enabled);
} }
void initializeFields() { void initializeFields() {
if (mode == PersonaDetailsMode.CREATE) {
try {
CentralRepoExaminer examiner = CentralRepository.getInstance().getOrInsertExaminer(System.getProperty("user.name"));
examinerField.setText(examiner.getLoginName());
} catch (CentralRepoException e) {
logger.log(Level.SEVERE, "Failed to access central repository", e);
JOptionPane.showMessageDialog(this,
Bundle.PersonaDetailsPanel_CentralRepoErr_msg(),
Bundle.PersonaDetailsPanel_CentralRepoErr_Title(),
JOptionPane.ERROR_MESSAGE);
}
}
updateAccountsTable(); updateAccountsTable();
updateMetadataTable(); updateMetadataTable();
updateAliasesTable(); updateAliasesTable();
@ -706,12 +874,14 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
} }
@Messages({ @Messages({
"PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account", "PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account.",
"PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account", "PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account",
"PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository", "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository.",
"PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure", "PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure",
"PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty", "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty.",
"PersonaDetailsPanel_EmptyName_Title=Empty persona name",}) "PersonaDetailsPanel_EmptyName_Title=Empty persona name",
"PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty.",
"PersonaDetailsPanel_EmptyComment_Title=Empty persona comment",})
Persona okHandler() { Persona okHandler() {
if (accountsToAdd.size() + currentAccounts.size() < 1) { if (accountsToAdd.size() + currentAccounts.size() < 1) {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
@ -721,6 +891,13 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
return null; return null;
} }
if (commentField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this,
Bundle.PersonaDetailsPanel_EmptyComment_msg(),
Bundle.PersonaDetailsPanel_EmptyComment_Title(),
JOptionPane.ERROR_MESSAGE);
return null;
}
if (nameField.getText().isEmpty()) { if (nameField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
Bundle.PersonaDetailsPanel_EmptyName_msg(), Bundle.PersonaDetailsPanel_EmptyName_msg(),
@ -735,7 +912,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
try { try {
PAccount firstAccount = accountsToAdd.get(0); PAccount firstAccount = accountsToAdd.get(0);
ret = Persona.createPersonaForAccount(nameField.getText(), ret = Persona.createPersonaForAccount(nameField.getText(),
"", Persona.PersonaStatus.ACTIVE, firstAccount.account, commentField.getText(), Persona.PersonaStatus.ACTIVE, firstAccount.account,
firstAccount.justification, firstAccount.confidence); firstAccount.justification, firstAccount.confidence);
for (int i = 1; i < accountsToAdd.size(); i++) { for (int i = 1; i < accountsToAdd.size(); i++) {
ret.addAccount(accountsToAdd.get(i).account, ret.addAccount(accountsToAdd.get(i).account,
@ -760,6 +937,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
case EDIT: case EDIT:
try { try {
ret = currentPersona; ret = currentPersona;
currentPersona.setComment(commentField.getText());
currentPersona.setName(nameField.getText()); currentPersona.setName(nameField.getText());
for (PAccount acc : accountsToAdd) { for (PAccount acc : accountsToAdd) {
ret.addAccount(acc.account, acc.justification, acc.confidence); ret.addAccount(acc.account, acc.justification, acc.confidence);
@ -767,18 +945,27 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
for (PersonaAccount acc : accountsToRemove) { for (PersonaAccount acc : accountsToRemove) {
ret.removeAccount(acc); ret.removeAccount(acc);
} }
for (HashMap.Entry<PersonaAccount, PAccount> entry : accountsToEdit.entrySet()) {
ret.modifyAccount(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
}
for (PMetadata md : metadataToAdd) { for (PMetadata md : metadataToAdd) {
ret.addMetadata(md.name, md.value, md.justification, md.confidence); ret.addMetadata(md.name, md.value, md.justification, md.confidence);
} }
for (PersonaMetadata md : metadataToRemove) { for (PersonaMetadata md : metadataToRemove) {
ret.removeMetadata(md); ret.removeMetadata(md);
} }
for (HashMap.Entry<PersonaMetadata, PMetadata> entry : metadataToEdit.entrySet()) {
ret.modifyMetadata(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
}
for (PAlias pa : aliasesToAdd) { for (PAlias pa : aliasesToAdd) {
ret.addAlias(pa.alias, pa.justification, pa.confidence); ret.addAlias(pa.alias, pa.justification, pa.confidence);
} }
for (PersonaAlias pa : aliasesToRemove) { for (PersonaAlias pa : aliasesToRemove) {
ret.removeAlias(pa); ret.removeAlias(pa);
} }
for (HashMap.Entry<PersonaAlias, PAlias> entry : aliasesToEdit.entrySet()) {
ret.modifyAlias(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
}
} catch (CentralRepoException e) { } catch (CentralRepoException e) {
logger.log(Level.SEVERE, "Failed to access central repository", e); logger.log(Level.SEVERE, "Failed to access central repository", e);
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,

View File

@ -215,7 +215,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
@Messages({ @Messages({
"PMTopComponent_search_exception_Title=Search failure", "PMTopComponent_search_exception_Title=Search failure",
"PMTopComponent_search_exception_msg=Failed to search personas",}) "PMTopComponent_search_exception_msg=Failed to search personas.",})
private void executeSearch() { private void executeSearch() {
Collection<Persona> results; Collection<Persona> results;
try { try {

View File

@ -19,8 +19,8 @@
package org.sleuthkit.autopsy.centralrepository.persona; package org.sleuthkit.autopsy.centralrepository.persona;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.openide.windows.WindowManager; import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
@ -35,20 +35,41 @@ public class PersonaMetadataDialog extends JDialog {
private final PersonaDetailsPanel pdp; private final PersonaDetailsPanel pdp;
private PersonaDetailsPanel.PMetadata currentMetadata;
/** /**
* Creates new add metadata dialog * Creates new add metadata dialog
*/ */
@Messages({"AddMetadataDialog.title.text=Add Metadata",}) @Messages({"AddMetadataDialog.title.text=Add Metadata",})
public PersonaMetadataDialog(PersonaDetailsPanel pdp) { public PersonaMetadataDialog(PersonaDetailsPanel pdp) {
super((JFrame) WindowManager.getDefault().getMainWindow(), super(SwingUtilities.windowForComponent(pdp),
Bundle.AddMetadataDialog_title_text(), Bundle.AddMetadataDialog_title_text(),
true); ModalityType.APPLICATION_MODAL);
this.pdp = pdp; this.pdp = pdp;
initComponents(); initComponents();
display(); display();
} }
PersonaMetadataDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PMetadata md) {
super(SwingUtilities.windowForComponent(pdp),
Bundle.AddMetadataDialog_title_text(),
ModalityType.APPLICATION_MODAL);
this.pdp = pdp;
initComponents();
currentMetadata = md;
confidenceComboBox.setSelectedItem(md.confidence);
justificationTextField.setText(md.justification);
nameTextField.setText(md.name);
valueTextField.setText(md.value);
nameTextField.setEnabled(false);
valueTextField.setEnabled(false);
display();
}
/** /**
* This method is called from within the constructor to initialize the form. * This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always * WARNING: Do NOT modify this code. The content of this method is always
@ -191,8 +212,17 @@ public class PersonaMetadataDialog extends JDialog {
@Messages({ @Messages({
"AddMetadataDialog_dup_Title=Metadata add failure", "AddMetadataDialog_dup_Title=Metadata add failure",
"AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona",}) "AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona.",
"AddMetadataDialog_empty_name_Title=Missing field(s)",
"AddMetadataDialog_empty_name_msg=A metadata entry cannot have an empty name or value.",})
private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed
if (nameTextField.getText().isEmpty() || valueTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this,
Bundle.AddMetadataDialog_empty_name_msg(),
Bundle.AddMetadataDialog_empty_name_Title(),
JOptionPane.ERROR_MESSAGE);
return;
}
if (justificationTextField.getText().isEmpty()) { if (justificationTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
Bundle.PersonaDetailsPanel_empty_justification_msg(), Bundle.PersonaDetailsPanel_empty_justification_msg(),
@ -200,11 +230,16 @@ public class PersonaMetadataDialog extends JDialog {
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return; return;
} }
if (pdp.addMetadata(
nameTextField.getText(), Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
valueTextField.getText(), String justification = justificationTextField.getText();
justificationTextField.getText(),
(Persona.Confidence) confidenceComboBox.getSelectedItem())) { if (currentMetadata != null) {
currentMetadata.confidence = confidence;
currentMetadata.justification = justification;
dispose();
} else {
if (pdp.addMetadata(nameTextField.getText(), valueTextField.getText(), justification, confidence)) {
dispose(); dispose();
} else { } else {
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this,
@ -212,6 +247,7 @@ public class PersonaMetadataDialog extends JDialog {
Bundle.AddMetadataDialog_dup_Title(), Bundle.AddMetadataDialog_dup_Title(),
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
} }
}
}//GEN-LAST:event_okBtnActionPerformed }//GEN-LAST:event_okBtnActionPerformed
private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed

View File

@ -976,7 +976,7 @@ MessageArtifactViewer.rtfbodyScrollPane.TabConstraints.tabTitle=RTF
MessageArtifactViewer.toText.text=to list goes here MessageArtifactViewer.toText.text=to list goes here
MessageArtifactViewer.toLabel.text=To: MessageArtifactViewer.toLabel.text=To:
MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML
CallLogArtifactViewer.localAccountPersonaLabel.text=Persona: CallLogArtifactViewer.localAccountPersonaLabel.text=Persona
CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1 CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1
CallLogArtifactViewer.localAccountPersonaButton.text=jButton1 CallLogArtifactViewer.localAccountPersonaButton.text=jButton1
ContactArtifactViewer.personasLabel.text=Personas ContactArtifactViewer.personasLabel.text=Personas

View File

@ -37,11 +37,18 @@ ApplicationContentViewer.title=Application
ApplicationContentViewer.toolTip=Displays file contents. ApplicationContentViewer.toolTip=Displays file contents.
CallLogArtifactViewer_number_from=From CallLogArtifactViewer_number_from=From
CallLogArtifactViewer_number_to=To CallLogArtifactViewer_number_to=To
CallLogArtifactViewer_persona_button_new=New CallLogArtifactViewer_persona_button_new=Create
CallLogArtifactViewer_persona_button_view=View CallLogArtifactViewer_persona_button_view=View
CallLogArtifactViewer_persona_label=\ Persona: CallLogArtifactViewer_persona_label=\ Persona
CallLogArtifactViewer_persona_searching=\ Searching... CallLogArtifactViewer_persona_searching=Searching...
CallLogArtifactViewer_persona_text_none=No Persona CallLogArtifactViewer_persona_text_none=None Found
ContactArtifactViewer_missing_account_label=Missing Account:
ContactArtifactViewer_persona_account_justification=Account found in Contact artifact
ContactArtifactViewer_persona_button_new=Create
ContactArtifactViewer_persona_button_view=View
ContactArtifactViewer_persona_label=Persona
ContactArtifactViewer_persona_searching=\ Searching...
ContactArtifactViewer_persona_text_none=None found
DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database
DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database
DefaultArtifactContentViewer.attrsTableHeader.sources=Source(s) DefaultArtifactContentViewer.attrsTableHeader.sources=Source(s)
@ -1080,3 +1087,4 @@ MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML
CallLogArtifactViewer.localAccountPersonaLabel.text=Persona: CallLogArtifactViewer.localAccountPersonaLabel.text=Persona:
CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1 CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1
CallLogArtifactViewer.localAccountPersonaButton.text=jButton1 CallLogArtifactViewer.localAccountPersonaButton.text=jButton1
ContactArtifactViewer.personasLabel.text=Personas

View File

@ -42,6 +42,7 @@ import javax.swing.SwingWorker;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount;
import org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsDialog; import org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsDialog;
@ -424,12 +425,17 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac
* @throws CentralRepoException * @throws CentralRepoException
*/ */
@NbBundle.Messages({ @NbBundle.Messages({
"ContactArtifactViewer_persona_searching= Searching..." "ContactArtifactViewer_persona_searching= Searching...",
"ContactArtifactViewer_persona_unknown=Unknown"
}) })
private void initiatePersonasSearch(List<BlackboardAttribute> accountAttributesList) throws CentralRepoException { private void initiatePersonasSearch(List<BlackboardAttribute> accountAttributesList) throws CentralRepoException {
personasLabel.setVisible(true); personasLabel.setVisible(true);
String personaStatusLabelText = CentralRepository.isEnabled()
? Bundle.ContactArtifactViewer_persona_searching()
: Bundle.ContactArtifactViewer_persona_unknown();
// create a gridbag layout to show each participant on one line // create a gridbag layout to show each participant on one line
GridBagLayout gridBagLayout = new GridBagLayout(); GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints(); GridBagConstraints constraints = new GridBagConstraints();
@ -451,19 +457,27 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac
personasPanel.add(personaLabel); personasPanel.add(personaLabel);
constraints.gridy++; constraints.gridy++;
javax.swing.JLabel primaryPersonaNameLabel = new javax.swing.JLabel(); javax.swing.JLabel personaStatusLabel = new javax.swing.JLabel();
primaryPersonaNameLabel.setText(Bundle.ContactArtifactViewer_persona_searching()); personaStatusLabel.setText(personaStatusLabelText);
gridBagLayout.setConstraints(primaryPersonaNameLabel, constraints); gridBagLayout.setConstraints(personaStatusLabel, constraints);
personasPanel.add(primaryPersonaNameLabel); personasPanel.add(personaStatusLabel);
personasPanel.setLayout(gridBagLayout);
personasPanel.revalidate(); if (CentralRepository.isEnabled() ) {
personasPanel.repaint(); personasLabel.setEnabled(true);
// Kick off a background task to serach for personas for the contact // Kick off a background task to serach for personas for the contact
ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList); ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList);
personaSearchTask.execute(); personaSearchTask.execute();
} else {
personasLabel.setEnabled(false);
personaLabel.setEnabled(false);
personaStatusLabel.setEnabled(false);
}
personasPanel.setLayout(gridBagLayout);
personasPanel.revalidate();
personasPanel.repaint();
} }
/** /**

View File

@ -3,7 +3,13 @@ Installer.closing.confirmationDialog.title=Ingest is Running
# {0} - exception message # {0} - exception message
Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0} Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0}
OpenIDE-Module-Display-Category=Infrastructure OpenIDE-Module-Display-Category=Infrastructure
OpenIDE-Module-Long-Description=This is the core Autopsy module.\n\nThe module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\nThe framework included in the module contains APIs for developing modules for ingest, viewers and reporting. The modules can be deployed as Plugins using the Autopsy plugin installer.\nThis module should not be uninstalled - without it, Autopsy will not run.\n\nFor more information, see http://www.sleuthkit.org/autopsy/ OpenIDE-Module-Long-Description=\
This is the core Autopsy module.\n\n\
The module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\n\
The framework included in the module contains APIs for developing modules for ingest, viewers and reporting. \
The modules can be deployed as Plugins using the Autopsy plugin installer.\n\
This module should not be uninstalled - without it, Autopsy will not run.\n\n\
For more information, see http://www.sleuthkit.org/autopsy/
OpenIDE-Module-Name=Autopsy-Core OpenIDE-Module-Name=Autopsy-Core
OpenIDE-Module-Short-Description=Autopsy Core Module OpenIDE-Module-Short-Description=Autopsy Core Module
org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml

View File

@ -19,12 +19,16 @@
package org.sleuthkit.autopsy.corecomponents; package org.sleuthkit.autopsy.corecomponents;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Window; import java.awt.Window;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Locale; import java.util.Locale;
import java.util.logging.Level;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -32,10 +36,10 @@ import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener; import javax.swing.event.HyperlinkListener;
import org.netbeans.core.actions.HTMLViewAction; import org.netbeans.core.actions.HTMLViewAction;
import org.openide.awt.HtmlBrowser;
import org.openide.modules.Places; import org.openide.modules.Places;
import org.openide.util.ImageUtilities; import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.PlatformUtil;
import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.autopsy.coreutils.Version;
import org.sleuthkit.datamodel.SleuthkitJNI; import org.sleuthkit.datamodel.SleuthkitJNI;
@ -47,6 +51,7 @@ import org.sleuthkit.datamodel.SleuthkitJNI;
public final class AboutWindowPanel extends JPanel implements HyperlinkListener { public final class AboutWindowPanel extends JPanel implements HyperlinkListener {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(AboutWindowPanel.class.getName());
private URL url = null; private URL url = null;
private final Icon about; private final Icon about;
private boolean verboseLogging; private boolean verboseLogging;
@ -67,12 +72,32 @@ public final class AboutWindowPanel extends JPanel implements HyperlinkListener
description.setText(org.openide.util.NbBundle.getMessage(AboutWindowPanel.class, description.setText(org.openide.util.NbBundle.getMessage(AboutWindowPanel.class,
"LBL_Description", new Object[]{getProductVersionValue(), getJavaValue(), getVMValue(), "LBL_Description", new Object[]{getProductVersionValue(), getJavaValue(), getVMValue(),
getOperatingSystemValue(), getEncodingValue(), getSystemLocaleValue(), getUserDirValue(), getSleuthKitVersionValue(), Version.getNetbeansBuild(), Version.getBuildType().toString()})); getOperatingSystemValue(), getEncodingValue(), getSystemLocaleValue(), getUserDirValue(), getSleuthKitVersionValue(), Version.getNetbeansBuild(), Version.getBuildType().toString()}));
description.addHyperlinkListener(this);
copyright.addHyperlinkListener(this);
copyright.setBackground(getBackground()); copyright.setBackground(getBackground());
if (verboseLoggingIsSet()) { if (verboseLoggingIsSet()) {
disableVerboseLoggingButton(); disableVerboseLoggingButton();
} }
AboutPanelHyperlinkListener hyperlinkListener = new AboutPanelHyperlinkListener();
copyright.addHyperlinkListener(hyperlinkListener);
description.addHyperlinkListener(hyperlinkListener);
}
/**
* Listener to display hyperlinks in an external viewer.
*/
private class AboutPanelHyperlinkListener implements HyperlinkListener {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED
&& Desktop.isDesktopSupported()) {
// Try to display the URL in the user's browswer.
try {
Desktop.getDesktop().browse(e.getURL().toURI());
} catch (IOException | URISyntaxException ex) {
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
}
}
}
} }
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@ -212,7 +237,14 @@ private void logoLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:e
if (url != null) { if (url != null) {
org.openide.awt.StatusDisplayer.getDefault().setStatusText( org.openide.awt.StatusDisplayer.getDefault().setStatusText(
NbBundle.getMessage(HTMLViewAction.class, "CTL_OpeningBrowser")); //NON-NLS NbBundle.getMessage(HTMLViewAction.class, "CTL_OpeningBrowser")); //NON-NLS
HtmlBrowser.URLDisplayer.getDefault().showURL(url); // Try to display the URL in the user's browswer.
if(Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(url.toURI());
} catch (IOException | URISyntaxException ex) {
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
}
}
} }
} }

View File

@ -17,7 +17,7 @@ DataContentViewerHex.pageLabel2.text=Page
# Product Information panel # Product Information panel
LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div> LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
Format_OperatingSystem_Value={0} version {1} running on {2} Format_OperatingSystem_Value={0} version {1} running on {2}
LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright &copy; 2003-2018. </div> LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style\="color: \#1E2A60;" href\="https://www.autopsy.com/support/training/">https://www.autopsy.com/support/training/</a></li><li>Support: <a style\="color: \#1E2A60;" href\="https://www.sleuthkit.org/support.php">https://www.sleuthkit.org/support.php</a></li></ul>Copyright &copy; 2003-2020. </div>
URL_ON_IMG=http://www.sleuthkit.org/ URL_ON_IMG=http://www.sleuthkit.org/
FILE_FOR_LOCAL_HELP=file:/// FILE_FOR_LOCAL_HELP=file:///
INDEX_FOR_LOCAL_HELP=/docs/index.html INDEX_FOR_LOCAL_HELP=/docs/index.html

View File

@ -17,9 +17,6 @@ CTL_DataContentTopComponent=Data Content
CTL_CustomAboutAction=About CTL_CustomAboutAction=About
CTL_OfflineHelpAction=Offline Autopsy Documentation CTL_OfflineHelpAction=Offline Autopsy Documentation
CTL_OnlineHelpAction=Online Autopsy Documentation CTL_OnlineHelpAction=Online Autopsy Documentation
DataContentViewerArtifact.attrsTableHeader.sources=Source(s)
DataContentViewerArtifact.attrsTableHeader.type=Type
DataContentViewerArtifact.attrsTableHeader.value=Value
DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database
DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database
DataContentViewerHex.copyingFile=Copying file to open in HxD... DataContentViewerHex.copyingFile=Copying file to open in HxD...
@ -63,9 +60,9 @@ DataContentViewerHex.totalPageLabel.text_1=100
DataContentViewerHex.pageLabel2.text=Page DataContentViewerHex.pageLabel2.text=Page
# Product Information panel # Product Information panel
LBL_Description=<div style="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div> LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
Format_OperatingSystem_Value={0} version {1} running on {2} Format_OperatingSystem_Value={0} version {1} running on {2}
LBL_Copyright=<div style="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style="color: #1E2A60;" href="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style="color: #1E2A60;" href="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style="color: #1E2A60;" href="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright &copy; 2003-2018. </div> LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>Training: <a style\="color: \#1E2A60;" href\="https://www.autopsy.com/support/training/">https://www.autopsy.com/support/training/</a></li><li>Support: <a style\="color: \#1E2A60;" href\="https://www.sleuthkit.org/support.php">https://www.sleuthkit.org/support.php</a></li></ul>Copyright &copy; 2003-2020. </div>
SortChooser.dialogTitle=Choose Sort Criteria SortChooser.dialogTitle=Choose Sort Criteria
ThumbnailViewChildren.progress.cancelling=(Cancelling) ThumbnailViewChildren.progress.cancelling=(Cancelling)
# {0} - file name # {0} - file name
@ -82,8 +79,6 @@ DataContentViewerArtifact.pageLabel2.text=Result
DataContentViewerArtifact.nextPageButton.text= DataContentViewerArtifact.nextPageButton.text=
DataContentViewerArtifact.currentPageLabel.text=1 DataContentViewerArtifact.currentPageLabel.text=1
DataContentViewerArtifact.ofLabel.text=of DataContentViewerArtifact.ofLabel.text=of
DataContentViewerArtifact.copyMenuItem.text=Copy
DataContentViewerArtifact.selectAllMenuItem.text=Select All
DataContentViewerArtifact.pageLabel.text=Result: DataContentViewerArtifact.pageLabel.text=Result:
AdvancedConfigurationDialog.applyButton.text=OK AdvancedConfigurationDialog.applyButton.text=OK
DataContentViewerHex.goToPageTextField.text= DataContentViewerHex.goToPageTextField.text=
@ -95,7 +90,7 @@ DataResultViewerThumbnail.pageNextButton.text=
DataResultViewerThumbnail.imagesLabel.text=Images: DataResultViewerThumbnail.imagesLabel.text=Images:
DataResultViewerThumbnail.imagesRangeLabel.text=- DataResultViewerThumbnail.imagesRangeLabel.text=-
DataResultViewerThumbnail.pageNumLabel.text=- DataResultViewerThumbnail.pageNumLabel.text=-
DataResultViewerThumbnail.filePathLabel.text=\ DataResultViewerThumbnail.filePathLabel.text=\ \ \
DataResultViewerThumbnail.goToPageLabel.text=Go to Page: DataResultViewerThumbnail.goToPageLabel.text=Go to Page:
DataResultViewerThumbnail.goToPageField.text= DataResultViewerThumbnail.goToPageField.text=
AdvancedConfigurationDialog.cancelButton.text=Cancel AdvancedConfigurationDialog.cancelButton.text=Cancel
@ -129,9 +124,9 @@ DataResultViewerThumbnail.switchPage.done.errMsg=Error making thumbnails: {0}
AboutWindowPanel.actVerboseLogging.text=Activate verbose logging AboutWindowPanel.actVerboseLogging.text=Activate verbose logging
OptionsCategory_Name_Multi_User_Settings=Multi-User OptionsCategory_Name_Multi_User_Settings=Multi-User
OptionsCategory_Keywords_Multi_User_Options=Multi-User Settings OptionsCategory_Keywords_Multi_User_Options=Multi-User Settings
MultiUserSettingsPanel.lbSolrSettings.text=Solr Settings MultiUserSettingsPanel.lbSolrSettings.text=Solr Server Settings
MultiUserSettingsPanel.cbEnableMultiUser.text=Enable multi-user cases MultiUserSettingsPanel.cbEnableMultiUser.text=Enable multi-user cases
MultiUserSettingsPanel.lbDatabaseSettings.text=Database Settings MultiUserSettingsPanel.lbDatabaseSettings.text=Database Server Settings
MultiUserSettingsPanel.validationErrMsg.incomplete=Fill in all values MultiUserSettingsPanel.validationErrMsg.incomplete=Fill in all values
MultiUserSettingsPanel.nonWindowsOs.msg=Multi-user cases are only available on Windows platforms MultiUserSettingsPanel.nonWindowsOs.msg=Multi-user cases are only available on Windows platforms
MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=Invalid database port number MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=Invalid database port number
@ -159,7 +154,7 @@ MultiUserSettingsPanel.tbSolrHostname.toolTipText=Hostname or IP Address
MultiUserSettingsPanel.tbSolrPort.toolTipText=Port Number MultiUserSettingsPanel.tbSolrPort.toolTipText=Port Number
MultiUserSettingsPanel.lbTestMessageService.text= MultiUserSettingsPanel.lbTestMessageService.text=
MultiUserSettingsPanel.bnTestMessageService.text=Test MultiUserSettingsPanel.bnTestMessageService.text=Test
MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ Message Service Settings MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ Message Server Settings
MultiUserSettingsPanel.tbMsgPort.toolTipText=Port Number MultiUserSettingsPanel.tbMsgPort.toolTipText=Port Number
MultiUserSettingsPanel.tbMsgPort.text= MultiUserSettingsPanel.tbMsgPort.text=
MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name (optional) MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name (optional)

View File

@ -65,7 +65,7 @@ DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8
# \u88fd\u54c1\u60c5\u5831\u30d1\u30cd\u30eb # \u88fd\u54c1\u60c5\u5831\u30d1\u30cd\u30eb
LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>\u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3:</b> {0} ({9}) <br><b>Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3:</b> {7} <br><b>Netbeans RCP\u30d3\u30eb\u30c9:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>\u30b7\u30b9\u30c6\u30e0:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div> LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>\u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3:</b> {0} ({9}) <br><b>Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3:</b> {7} <br><b>Netbeans RCP\u30d3\u30eb\u30c9:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>\u30b7\u30b9\u30c6\u30e0:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
Format_OperatingSystem_Value={2} \u4e0a\u3067 {0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u304c\u5b9f\u884c\u4e2d\u3067\u3059 Format_OperatingSystem_Value={2} \u4e0a\u3067 {0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u304c\u5b9f\u884c\u4e2d\u3067\u3059
LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; \u306fSleuth Kit&trade\u3068\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u30d9\u30fc\u30b9\u3068\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002<br><ul><li>\u5168\u822c\u60c5\u5831: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>\u30c8\u30ec\u30fc\u30cb\u30f3\u30b0: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>\u30b3\u30de\u30fc\u30b7\u30e3\u30eb\u30b5\u30dd\u30fc\u30c8: <a style\="color: \#1E2A60;" href\="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>\u8457\u4f5c\u6a29 &copy; 2003-2018.</div> LBL_Copyright=<div style\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; \u306fSleuth Kit&trade\u3068\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u30d9\u30fc\u30b9\u3068\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002<br><ul><li>\u5168\u822c\u60c5\u5831: <a style\="color: \#1E2A60;" href\="http://www.sleuthkit.org">http://www.sleuthkit.org</a>.</li><li>\u30c8\u30ec\u30fc\u30cb\u30f3\u30b0: <a style\="color: \#1E2A60;" https://www.autopsy.com/support/training/">https://www.autopsy.com/support/training/</a></li><li>\u30b5\u30dd\u30fc\u30c8: <a style\="color: \#1E2A60;" href\="https://www.sleuthkit.org/support.php">https://www.sleuthkit.org/support.php</a></li></ul>\u8457\u4f5c\u6a29 &copy; 2003-2020.</div>
SortChooser.dialogTitle=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u9078\u629e SortChooser.dialogTitle=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u9078\u629e
ThumbnailViewChildren.progress.cancelling=(\u53d6\u308a\u6d88\u3057\u4e2d) ThumbnailViewChildren.progress.cancelling=(\u53d6\u308a\u6d88\u3057\u4e2d)
# {0} - \u30d5\u30a1\u30a4\u30eb\u540d # {0} - \u30d5\u30a1\u30a4\u30eb\u540d

View File

@ -30,7 +30,9 @@ PlatformUtil.getProcVmUsed.sigarNotInit.msg=Cannot get virt mem used, sigar not
PlatformUtil.getProcVmUsed.gen.msg=Cannot get virt mem used, {0} PlatformUtil.getProcVmUsed.gen.msg=Cannot get virt mem used, {0}
PlatformUtil.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1} PlatformUtil.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1}
PlatformUtil.getPhysicalMemInfo.usageText=Physical memory usage (max, total, free): {0}, {1}, {2} PlatformUtil.getPhysicalMemInfo.usageText=Physical memory usage (max, total, free): {0}, {1}, {2}
PlatformUtil.getAllMemUsageInfo.usageText={0}\n{1}\nProcess Virtual Memory: {2} PlatformUtil.getAllMemUsageInfo.usageText={0}\n\
{1}\n\
Process Virtual Memory: {2}
# {0} - file name # {0} - file name
ReadImageTask.mesageText=Reading image: {0} ReadImageTask.mesageText=Reading image: {0}
StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract

View File

@ -199,7 +199,7 @@ ContentTagNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8 ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8
ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8 ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8
ContentTagNode.createSheet.fileModifiedTime.nam=\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileModifiedTime.name=\u66f4\u65b0\u65e5\u6642
ContentTagNode.createSheet.fileModifiedTime.displayName=\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileModifiedTime.displayName=\u66f4\u65b0\u65e5\u6642
ContentTagNode.createSheet.fileChangedTime.name=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileChangedTime.name=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642
ContentTagNode.createSheet.fileChangedTime.displayName=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileChangedTime.displayName=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642

View File

@ -38,8 +38,6 @@ HINT_DirectoryTreeTopComponent=This is a DirectoryTree window
OpenIDE-Module-Name=DirectoryTree OpenIDE-Module-Name=DirectoryTree
FileSystemDetailsPanel.imgOffsetLabel.text=Image Offset: FileSystemDetailsPanel.imgOffsetLabel.text=Image Offset:
FileSystemDetailsPanel.fsTypeLabel.text=FileSystem Type: FileSystemDetailsPanel.fsTypeLabel.text=FileSystem Type:
FileSystemDetailsPanel.jLabel2.text=bytes
FileSystemDetailsPanel.jLabel3.text=bytes
FileSystemDetailsPanel.fsTypeValue.text=... FileSystemDetailsPanel.fsTypeValue.text=...
FileSystemDetailsPanel.imgOffsetValue.text=... FileSystemDetailsPanel.imgOffsetValue.text=...
FileSystemDetailsPanel.volumeIDValue.text=... FileSystemDetailsPanel.volumeIDValue.text=...
@ -71,7 +69,6 @@ VolumeDetailsPanel.startLabel.text=Starting Sector:
VolumeDetailsPanel.lengthLabel.text=Length in Sectors: VolumeDetailsPanel.lengthLabel.text=Length in Sectors:
VolumeDetailsPanel.descLabel.text=Description: VolumeDetailsPanel.descLabel.text=Description:
VolumeDetailsPanel.flagsLabel.text=Flags: VolumeDetailsPanel.flagsLabel.text=Flags:
VolumeDetailsPanel.jLabel1.text=General Volume Information
VolumeDetailsPanel.OKButton.text=OK VolumeDetailsPanel.OKButton.text=OK
ImageDetailsPanel.imageInfoLabel.text=Image Information ImageDetailsPanel.imageInfoLabel.text=Image Information
ImageDetailsPanel.imgNameLabel.text=Name: ImageDetailsPanel.imgNameLabel.text=Name:
@ -160,3 +157,6 @@ ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
ExternalViewerGlobalSettingsPanel.HxDLabel.text=HxD Editor Path: ExternalViewerGlobalSettingsPanel.HxDLabel.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.ContentViewerExtensionLabel.text=Add content viewer extensions: ExternalViewerGlobalSettingsPanel.ContentViewerExtensionLabel.text=Add content viewer extensions:
FileSystemDetailsPanel.bytesLabel1.text=bytes
FileSystemDetailsPanel.bytesLabel2.text=bytes
VolumeDetailsPanel.generalVolumeLabel.text=General Volume Information

View File

@ -14,11 +14,9 @@ KnownStatusSearchPanel.knownCheckBox.text=Known Status:
KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable
KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other) KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other)
KnownStatusSearchPanel.unknownOptionCheckBox.text=Unknown KnownStatusSearchPanel.unknownOptionCheckBox.text=Unknown
DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected! DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected\!
DateSearchPanel.dateCheckBox.text=Date: DateSearchPanel.dateCheckBox.text=Date:
DateSearchPanel.jLabel4.text=Timezone: DateSearchPanel.jLabel4.text=Timezone:
DateSearchPanel.jLabel3.text=*The date format is mm/dd/yyyy
DateSearchPanel.jLabel2.text=*Empty fields mean "No Limit"
DateSearchPanel.createdCheckBox.text=Created DateSearchPanel.createdCheckBox.text=Created
DateSearchPanel.accessedCheckBox.text=Accessed DateSearchPanel.accessedCheckBox.text=Accessed
DateSearchPanel.changedCheckBox.text=Changed DateSearchPanel.changedCheckBox.text=Changed
@ -57,12 +55,11 @@ FileSearchPanel.search.results.details=Large number of matches may impact perfor
FileSearchPanel.search.exception.noFilterSelected.msg=At least one filter must be selected. FileSearchPanel.search.exception.noFilterSelected.msg=At least one filter must be selected.
FileSearchPanel.search.validationErr.msg=Validation Error: {0} FileSearchPanel.search.validationErr.msg=Validation Error: {0}
FileSearchPanel.emptyWhereClause.text=Invalid options, nothing to show. FileSearchPanel.emptyWhereClause.text=Invalid options, nothing to show.
KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected! KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected\!
NameSearchFilter.emptyNameMsg.text=Must enter something for name search. NameSearchFilter.emptyNameMsg.text=Must enter something for name search.
SizeSearchPanel.sizeCompareComboBox.equalTo=equal to SizeSearchPanel.sizeCompareComboBox.equalTo=equal to
SizeSearchPanel.sizeCompareComboBox.greaterThan=greater than SizeSearchPanel.sizeCompareComboBox.greaterThan=greater than
SizeSearchPanel.sizeCompareComboBox.lessThan=less than SizeSearchPanel.sizeCompareComboBox.lessThan=less than
MimeTypePanel.jLabel1.text=*Note: Multiple MIME types can be selected
FileSearchPanel.searchButton.text=Search FileSearchPanel.searchButton.text=Search
MimeTypePanel.mimeTypeCheckBox.text=MIME Type: MimeTypePanel.mimeTypeCheckBox.text=MIME Type:
HashSearchPanel.md5CheckBox.text=MD5: HashSearchPanel.md5CheckBox.text=MD5:
@ -72,3 +69,6 @@ DataSourcePanel.dataSourceCheckBox.label=Data Source:
DataSourcePanel.dataSourceCheckBox.actionCommand=Data Source: DataSourcePanel.dataSourceCheckBox.actionCommand=Data Source:
DataSourcePanel.dataSourceCheckBox.text=Data Source: DataSourcePanel.dataSourceCheckBox.text=Data Source:
DataSourcePanel.dataSourceNoteLabel.text=*Note: Multiple data sources can be selected DataSourcePanel.dataSourceNoteLabel.text=*Note: Multiple data sources can be selected
DateSearchPanel.noLimitLabel.text=*Empty fields mean "No Limit"
DateSearchPanel.dateFormatLabel.text=*The date format is mm/dd/yyyy
MimeTypePanel.noteLabel.text=*Note: Multiple MIME types can be selected

View File

@ -81,6 +81,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
/** /**
* The map panel. This panel contains the jxmapviewer MapViewer * The map panel. This panel contains the jxmapviewer MapViewer
*/ */
@SuppressWarnings("deprecation")
final public class MapPanel extends javax.swing.JPanel { final public class MapPanel extends javax.swing.JPanel {
static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION"; static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION";
@ -759,6 +760,7 @@ final public class MapPanel extends javax.swing.JPanel {
/** /**
* *
* @param waypoint the waypoint for which to get the color selected * @param waypoint the waypoint for which to get the color selected
*
* @return the color that this waypoint should be rendered * @return the color that this waypoint should be rendered
*/ */
private Color getColor(MapWaypoint waypoint) { private Color getColor(MapWaypoint waypoint) {
@ -776,6 +778,7 @@ final public class MapPanel extends javax.swing.JPanel {
* Creates a dot image with the specified color * Creates a dot image with the specified color
* *
* @param color the color of the new image * @param color the color of the new image
*
* @return the new dot image * @return the new dot image
*/ */
private BufferedImage createTrackDotImage(Color color) { private BufferedImage createTrackDotImage(Color color) {
@ -797,6 +800,7 @@ final public class MapPanel extends javax.swing.JPanel {
* Creates a waypoint image with the specified color * Creates a waypoint image with the specified color
* *
* @param color the color of the new image * @param color the color of the new image
*
* @return the new waypoint image * @return the new waypoint image
*/ */
private BufferedImage createWaypointImage(Color color) { private BufferedImage createWaypointImage(Color color) {

View File

@ -62,6 +62,7 @@ import org.sleuthkit.datamodel.TskCoreException;
* Waypoint interface. * Waypoint interface.
* *
*/ */
@SuppressWarnings("deprecation")
final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewer.Waypoint { final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewer.Waypoint {
private static final Logger logger = Logger.getLogger(MapWaypoint.class.getName()); private static final Logger logger = Logger.getLogger(MapWaypoint.class.getName());

View File

@ -140,7 +140,7 @@ IngestJob.cancelReason.outOfDiskSpace.text=Out of disk space
IngestJob.cancelReason.servicesDown.text=Services Down IngestJob.cancelReason.servicesDown.text=Services Down
IngestJob.cancelReason.caseClosed.text=Case closed IngestJob.cancelReason.caseClosed.text=Case closed
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
gest= gest
IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
IngestJobSettingsPanel.pastJobsButton.text=History IngestJobSettingsPanel.pastJobsButton.text=History

View File

@ -29,6 +29,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandle;
import org.openide.util.Cancellable; import org.openide.util.Cancellable;
@ -58,8 +61,13 @@ import org.sleuthkit.autopsy.python.FactoryClassNameNormalizer;
*/ */
public final class DataSourceIngestJob { public final class DataSourceIngestJob {
private static String AUTOPSY_MODULE_PREFIX = "org.sleuthkit.autopsy";
private static final Logger logger = Logger.getLogger(DataSourceIngestJob.class.getName()); private static final Logger logger = Logger.getLogger(DataSourceIngestJob.class.getName());
// to match something like: "org.python.proxies.GPX_Parser_Module$GPXParserFileIngestModuleFactory$14"
private static final Pattern JYTHON_REGEX = Pattern.compile("org\\.python\\.proxies\\.(.+?)\\$(.+?)(\\$[0-9]*)?$");
/** /**
* These fields define a data source ingest job: the parent ingest job, an * These fields define a data source ingest job: the parent ingest job, an
* ID, the user's ingest job settings, and the data source to be analyzed. * ID, the user's ingest job settings, and the data source to be analyzed.
@ -216,6 +224,74 @@ public final class DataSourceIngestJob {
this.createIngestPipelines(); this.createIngestPipelines();
} }
/**
* Adds ingest modules to a list with autopsy modules first and third party
* modules next.
*
* @param dest The destination for the modules to be added.
* @param src A map of fully qualified class name mapped to the
* IngestModuleTemplate.
* @param jythonSrc A map of fully qualified class name mapped to the
* IngestModuleTemplate for jython modules.
*/
private static void addOrdered(final List<IngestModuleTemplate> dest,
final Map<String, IngestModuleTemplate> src, final Map<String, IngestModuleTemplate> jythonSrc) {
final List<IngestModuleTemplate> autopsyModules = new ArrayList<>();
final List<IngestModuleTemplate> thirdPartyModules = new ArrayList<>();
Stream.concat(src.entrySet().stream(), jythonSrc.entrySet().stream()).forEach((templateEntry) -> {
if (templateEntry.getKey().startsWith(AUTOPSY_MODULE_PREFIX)) {
autopsyModules.add(templateEntry.getValue());
} else {
thirdPartyModules.add(templateEntry.getValue());
}
});
dest.addAll(autopsyModules);
dest.addAll(thirdPartyModules);
}
/**
* Takes a classname like
* "org.python.proxies.GPX_Parser_Module$GPXParserFileIngestModuleFactory$14"
* and provides "GPX_Parser_Module.GPXParserFileIngestModuleFactory" or null
* if not in jython package.
*
* @param canonicalName The canonical name.
*
* @return The jython name or null if not in jython package.
*/
private static String getJythonName(String canonicalName) {
Matcher m = JYTHON_REGEX.matcher(canonicalName);
if (m.find()) {
return String.format("%s.%s", m.group(1), m.group(2));
} else {
return null;
}
}
/**
* Adds a template to the appropriate map. If the class is a jython class,
* then it is added to the jython map. Otherwise, it is added to the
* mapping.
*
* @param mapping Mapping for non-jython objects.
* @param jythonMapping Mapping for jython objects.
* @param template The template to add.
*/
private static void addModule(Map<String, IngestModuleTemplate> mapping,
Map<String, IngestModuleTemplate> jythonMapping, IngestModuleTemplate template) {
String className = template.getModuleFactory().getClass().getCanonicalName();
String jythonName = getJythonName(className);
if (jythonName != null) {
jythonMapping.put(jythonName, template);
} else {
mapping.put(className, template);
}
}
/** /**
* Creates the file and data source ingest pipelines. * Creates the file and data source ingest pipelines.
*/ */
@ -227,12 +303,18 @@ public final class DataSourceIngestJob {
*/ */
Map<String, IngestModuleTemplate> dataSourceModuleTemplates = new LinkedHashMap<>(); Map<String, IngestModuleTemplate> dataSourceModuleTemplates = new LinkedHashMap<>();
Map<String, IngestModuleTemplate> fileModuleTemplates = new LinkedHashMap<>(); Map<String, IngestModuleTemplate> fileModuleTemplates = new LinkedHashMap<>();
// mappings for jython modules. These mappings are only used to determine modules in the pipelineconfig.xml.
Map<String, IngestModuleTemplate> jythonDataSourceModuleTemplates = new LinkedHashMap<>();
Map<String, IngestModuleTemplate> jythonFileModuleTemplates = new LinkedHashMap<>();
for (IngestModuleTemplate template : ingestModuleTemplates) { for (IngestModuleTemplate template : ingestModuleTemplates) {
if (template.isDataSourceIngestModuleTemplate()) { if (template.isDataSourceIngestModuleTemplate()) {
dataSourceModuleTemplates.put(template.getModuleFactory().getClass().getCanonicalName(), template); addModule(dataSourceModuleTemplates, jythonDataSourceModuleTemplates, template);
} }
if (template.isFileIngestModuleTemplate()) { if (template.isFileIngestModuleTemplate()) {
fileModuleTemplates.put(template.getModuleFactory().getClass().getCanonicalName(), template); addModule(fileModuleTemplates, jythonFileModuleTemplates, template);
} }
} }
@ -241,21 +323,22 @@ public final class DataSourceIngestJob {
* ordered lists of ingest module templates for each ingest pipeline. * ordered lists of ingest module templates for each ingest pipeline.
*/ */
IngestPipelinesConfiguration pipelineConfigs = IngestPipelinesConfiguration.getInstance(); IngestPipelinesConfiguration pipelineConfigs = IngestPipelinesConfiguration.getInstance();
List<IngestModuleTemplate> firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig()); List<IngestModuleTemplate> firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(
List<IngestModuleTemplate> fileIngestModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(fileModuleTemplates, pipelineConfigs.getFileIngestPipelineConfig()); dataSourceModuleTemplates, jythonDataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig());
List<IngestModuleTemplate> secondStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageTwoDataSourceIngestPipelineConfig());
List<IngestModuleTemplate> fileIngestModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(
fileModuleTemplates, jythonFileModuleTemplates, pipelineConfigs.getFileIngestPipelineConfig());
List<IngestModuleTemplate> secondStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(
dataSourceModuleTemplates, null, pipelineConfigs.getStageTwoDataSourceIngestPipelineConfig());
/** /**
* Add any module templates that were not specified in the pipelines * Add any module templates that were not specified in the pipelines
* configuration to an appropriate pipeline - either the first stage * configuration to an appropriate pipeline - either the first stage
* data source ingest pipeline or the file ingest pipeline. * data source ingest pipeline or the file ingest pipeline.
*/ */
for (IngestModuleTemplate template : dataSourceModuleTemplates.values()) { addOrdered(firstStageDataSourceModuleTemplates, dataSourceModuleTemplates, jythonDataSourceModuleTemplates);
firstStageDataSourceModuleTemplates.add(template); addOrdered(fileIngestModuleTemplates, fileModuleTemplates, jythonFileModuleTemplates);
}
for (IngestModuleTemplate template : fileModuleTemplates.values()) {
fileIngestModuleTemplates.add(template);
}
/** /**
* Construct the data source ingest pipelines. * Construct the data source ingest pipelines.
@ -304,19 +387,27 @@ public final class DataSourceIngestJob {
* ingest pipeline. The ingest module templates are removed from the input * ingest pipeline. The ingest module templates are removed from the input
* collection as they are added to the output collection. * collection as they are added to the output collection.
* *
* @param ingestModuleTemplates A mapping of ingest module factory class * @param ingestModuleTemplates A mapping of ingest module factory
* names to ingest module templates. * class names to ingest module
* @param pipelineConfig An ordered list of ingest module factory * templates.
* class names representing an ingest pipeline. * @param jythonIngestModuleTemplates A mapping of jython processed class
* names to jython ingest module
* templates.
* @param pipelineConfig An ordered list of ingest module
* factory class names representing an
* ingest pipeline.
* *
* @return An ordered list of ingest module templates, i.e., an * @return An ordered list of ingest module templates, i.e., an
* uninstantiated pipeline. * uninstantiated pipeline.
*/ */
private static List<IngestModuleTemplate> getConfiguredIngestModuleTemplates(Map<String, IngestModuleTemplate> ingestModuleTemplates, List<String> pipelineConfig) { private static List<IngestModuleTemplate> getConfiguredIngestModuleTemplates(
Map<String, IngestModuleTemplate> ingestModuleTemplates, Map<String, IngestModuleTemplate> jythonIngestModuleTemplates, List<String> pipelineConfig) {
List<IngestModuleTemplate> templates = new ArrayList<>(); List<IngestModuleTemplate> templates = new ArrayList<>();
for (String moduleClassName : pipelineConfig) { for (String moduleClassName : pipelineConfig) {
if (ingestModuleTemplates.containsKey(moduleClassName)) { if (ingestModuleTemplates != null && ingestModuleTemplates.containsKey(moduleClassName)) {
templates.add(ingestModuleTemplates.remove(moduleClassName)); templates.add(ingestModuleTemplates.remove(moduleClassName));
} else if (jythonIngestModuleTemplates != null && jythonIngestModuleTemplates.containsKey(moduleClassName)) {
templates.add(jythonIngestModuleTemplates.remove(moduleClassName));
} }
} }
return templates; return templates;

View File

@ -937,7 +937,7 @@ class IngestMessagePanel extends JPanel implements TableModelListener {
Object aValue = value; Object aValue = value;
if (value instanceof Date) { if (value instanceof Date) {
Date date = (Date) value; Date date = (Date) value;
DateFormat df = new SimpleDateFormat("HH:mm:ss"); DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
aValue = df.format(date); aValue = df.format(date);
} else { } else {
throw new RuntimeException(NbBundle.getMessage(this.getClass(), throw new RuntimeException(NbBundle.getMessage(this.getClass(),

View File

@ -221,7 +221,7 @@ class IngestProgressSnapshotPanel extends javax.swing.JPanel {
cellValue = snapShot.getDataSource(); cellValue = snapShot.getDataSource();
break; break;
case 2: case 2:
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
cellValue = dateFormat.format(new Date(snapShot.getJobStartTime())); cellValue = dateFormat.format(new Date(snapShot.getJobStartTime()));
break; break;
case 3: case 3:

View File

@ -4,7 +4,7 @@ Contains only the core ingest modules that ship with Autopsy -->
<PIPELINE_CONFIG> <PIPELINE_CONFIG>
<PIPELINE type="ImageAnalysisStageOne"> <PIPELINE type="ImageAnalysisStageOne">
<MODULE>org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory</MODULE> <MODULE>org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory</MODULE>
<MODULE>org.sleuthkit.autopsy.modules.android.AndroidModuleFactory</MODULE> <MODULE>module.AndroidModuleFactory</MODULE>
</PIPELINE> </PIPELINE>
<PIPELINE type="FileAnalysis"> <PIPELINE type="FileAnalysis">
@ -17,6 +17,7 @@ Contains only the core ingest modules that ship with Autopsy -->
<MODULE>org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory</MODULE> <MODULE>org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory</MODULE>
<MODULE>org.sleuthkit.autopsy.modules.interestingitems.InterestingItemsIngestModuleFactory</MODULE> <MODULE>org.sleuthkit.autopsy.modules.interestingitems.InterestingItemsIngestModuleFactory</MODULE>
<MODULE>org.sleuthkit.autopsy.modules.photoreccarver.PhotoRecCarverIngestModuleFactory</MODULE> <MODULE>org.sleuthkit.autopsy.modules.photoreccarver.PhotoRecCarverIngestModuleFactory</MODULE>
<MODULE>GPX_Parser_Module.GPXParserFileIngestModuleFactory</MODULE>
</PIPELINE> </PIPELINE>
<PIPELINE type="ImageAnalysisStageTwo"> <PIPELINE type="ImageAnalysisStageTwo">

View File

@ -18,10 +18,10 @@ SelectDriveDialog.diskTable.column2.title=Disk Size
SelectDriveDialog.errLabel.disksNotDetected.text=Disks were not detected. On some systems it requires admin privileges SelectDriveDialog.errLabel.disksNotDetected.text=Disks were not detected. On some systems it requires admin privileges
SelectDriveDialog.errLabel.disksNotDetected.toolTipText=Disks were not detected. SelectDriveDialog.errLabel.disksNotDetected.toolTipText=Disks were not detected.
SelectDriveDialog.lbSelectDrive.text=Select the drive to copy the application and script to: SelectDriveDialog.lbSelectDrive.text=Select the drive to copy the application and script to:
SelectDriveDialog.jLabel1.text=Select drive to use for live triage (may take time to load):
SelectDriveDialog.errorLabel.text=jLabel2 SelectDriveDialog.errorLabel.text=jLabel2
SelectDriveDialog.bnCancel.text=Cancel SelectDriveDialog.bnCancel.text=Cancel
SelectDriveDialog.jTextArea1.text=This feature copies the application and a batch file to a removable drive,\nallowing systems to be analyzed without installing the software or\nimaging the drives.\n\nTo analyze a system, insert the drive and run "RunFromUSB.bat" as\nadministrator, then select the "Local Disk" option on the Add Data Source\npanel. SelectDriveDialog.descriptionTextArea.text=This feature copies the application and a batch file to a removable drive,\nallowing systems to be analyzed without installing the software or\nimaging the drives.\n\nTo analyze a system, insert the drive and run "RunFromUSB.bat" as\nadministrator, then select the "Local Disk" option on the Add Data Source\npanel.
SelectDriveDialog.localDiskModel.loading.msg= SelectDriveDialog.localDiskModel.loading.msg=
SelectDriveDialog.localDiskModel.nodrives.msg=Executable could not be found SelectDriveDialog.localDiskModel.nodrives.msg=Executable could not be found
SelectDriveDialog.selectDriveLabel.text=Select drive to use for live triage (may take time to load):
SelectDriveDialog.title=Create Live Triage Drive SelectDriveDialog.title=Create Live Triage Drive

View File

@ -45,6 +45,6 @@ DataSourceIntegrityIngestModule.shutDown.resultLi=<li>Result:{0} </li>
DataSourceIntegrityIngestModule.shutDown.calcHashLi=<li>Calculated hash: {0} </li> DataSourceIntegrityIngestModule.shutDown.calcHashLi=<li>Calculated hash: {0} </li>
DataSourceIntegrityIngestModule.shutDown.storedHashLi=<li>Stored hash: {0} </li> DataSourceIntegrityIngestModule.shutDown.storedHashLi=<li>Stored hash: {0} </li>
DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text=Calculate data source hashes if none are present DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text=Calculate data source hashes if none are present
DataSourceIntegrityIngestSettingsPanel.jLabel1.text=Note that this module will not run on logical files
DataSourceIntegrityIngestSettingsPanel.jLabel3.text=Ingest Settings
DataSourceIntegrityIngestSettingsPanel.verifyHashesCheckbox.text=Verify existing data source hashes DataSourceIntegrityIngestSettingsPanel.verifyHashesCheckbox.text=Verify existing data source hashes
DataSourceIntegrityIngestSettingsPanel.ingestSettingsLabel.text=Ingest Settings
DataSourceIntegrityIngestSettingsPanel.noteLabel.text=Note that this module will not run on logical files

View File

@ -11,7 +11,12 @@ ExtractArchiveWithPasswordAction.progress.text=Unpacking contents of archive: {0
ExtractArchiveWithPasswordAction.prompt.text=Enter Password ExtractArchiveWithPasswordAction.prompt.text=Enter Password
ExtractArchiveWithPasswordAction.prompt.title=Enter Password ExtractArchiveWithPasswordAction.prompt.title=Enter Password
OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Display-Category=Ingest Module
OpenIDE-Module-Long-Description=Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\nContents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\nIf the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\nThe extracted files are navigable in the directory tree.\n\nThe module is supported on Windows, Linux and Mac operating systems. OpenIDE-Module-Long-Description=\
Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\n\
Contents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\n\
If the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\n\
The extracted files are navigable in the directory tree.\n\n\
The module is supported on Windows, Linux and Mac operating systems.
OpenIDE-Module-Name=Embedded File Extraction OpenIDE-Module-Name=Embedded File Extraction
OpenIDE-Module-Short-Description=Embedded File Extraction Ingest Module OpenIDE-Module-Short-Description=Embedded File Extraction Ingest Module
EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=Invalid seek origin: {0} EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=Invalid seek origin: {0}
@ -23,7 +28,6 @@ EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=Possib
EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=Compression ratio is {0}, skipping items in {1}. EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=Compression ratio is {0}, skipping items in {1}.
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=Possible ZIP bomb detected: {0} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=Possible ZIP bomb detected: {0}
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=The archive is {0} levels deep, skipping processing of {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=The archive is {0} levels deep, skipping processing of {1}
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=Unknown item path in archive: {0}, will use: {1}
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=Not enough disk space to unpack archive item: {0}, {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=Not enough disk space to unpack archive item: {0}, {1}
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=The archive item is too large to unpack, skipping unpacking this item. EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=The archive item is too large to unpack, skipping unpacking this item.
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg=Error unpacking {0} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg=Error unpacking {0}

View File

@ -2,7 +2,9 @@ CannotRunFileTypeDetection=Cannot run file type detection.
ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s). ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s).
ExifParserFileIngestModule.userContent.description=EXIF metadata exists for this file. ExifParserFileIngestModule.userContent.description=EXIF metadata exists for this file.
OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Display-Category=Ingest Module
OpenIDE-Module-Long-Description=Exif metadata ingest module. \n\nThe ingest module analyzes image files, extracts Exif information and posts the Exif data as results. OpenIDE-Module-Long-Description=\
Exif metadata ingest module. \n\n\
The ingest module analyzes image files, extracts Exif information and posts the Exif data as results.
OpenIDE-Module-Name=ExifParser OpenIDE-Module-Name=ExifParser
OpenIDE-Module-Short-Description=Exif metadata ingest module OpenIDE-Module-Short-Description=Exif metadata ingest module
ExifParserFileIngestModule.moduleName.text=Exif Parser ExifParserFileIngestModule.moduleName.text=Exif Parser

View File

@ -36,27 +36,27 @@ FileExtMismatchSettingsPanel.jLabel1.text=File Types:
FileExtMismatchSettingsPanel.newExtButton.text=New Extension FileExtMismatchSettingsPanel.newExtButton.text=New Extension
FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type: FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type:
FileExtMismatchSettingsPanel.newMimePrompt.title=New MIME FileExtMismatchSettingsPanel.newMimePrompt.title=New MIME
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty! FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty\!
FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=Empty type FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=Empty type
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported! FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported\!
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=Type not supported FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=Type not supported
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists! FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists\!
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=Type already exists FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=Type already exists
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=MIME type is not detectable by this module. FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=MIME type is not detectable by this module.
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=Type not detectable FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=Type not detectable
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected! FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected\!
FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=No type selected FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=No type selected
FileExtMismatchSettingsPanel.newExtPrompt.message=Add an allowed extension: FileExtMismatchSettingsPanel.newExtPrompt.message=Add an allowed extension:
FileExtMismatchSettingsPanel.newExtPrompt.title=New allowed extension FileExtMismatchSettingsPanel.newExtPrompt.title=New allowed extension
FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty! FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty\!
FileExtMismatchSettingsPanel.newExtPrompt.empty.title=Extension text empty FileExtMismatchSettingsPanel.newExtPrompt.empty.title=Extension text empty
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected! FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected\!
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=No MIME type selected FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=No MIME type selected
FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists! FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists\!
FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=Extension already exists FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=Extension already exists
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected! FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected\!
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=No extension selected FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=No extension selected
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected! FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected\!
FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=No MIME type selected FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=No MIME type selected
FileExtMismatchSettingsPanel.removeTypeButton.toolTipText= FileExtMismatchSettingsPanel.removeTypeButton.toolTipText=
FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types

View File

@ -51,7 +51,6 @@ FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=Load Failed
FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=Failed to load existing file type definitions. FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=Failed to load existing file type definitions.
FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=Failed to save file type definitions. FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=Failed to save file type definitions.
FileTypeIdGlobalSettingsPanel.newTypeButton.text=New Type FileTypeIdGlobalSettingsPanel.newTypeButton.text=New Type
FileTypeIdGlobalSettingsPanel.jLabel2.text=Custom MIME Types:
FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector. FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector.
AddFileTypeSignaturePanel.offsetLabel.text=Byte Offset AddFileTypeSignaturePanel.offsetLabel.text=Byte Offset
AddFileTypeSignaturePanel.signatureTextField.text= AddFileTypeSignaturePanel.signatureTextField.text=
@ -60,7 +59,6 @@ AddFileTypeSignaturePanel.signatureLabel.text=Signature
AddFileTypeSignaturePanel.hexPrefixLabel.text=0x AddFileTypeSignaturePanel.hexPrefixLabel.text=0x
AddFileTypeSignaturePanel.offsetRelativeToLabel.text=Offset is relative to AddFileTypeSignaturePanel.offsetRelativeToLabel.text=Offset is relative to
AddFileTypeSignaturePanel.offsetTextField.text= AddFileTypeSignaturePanel.offsetTextField.text=
FileTypeIdGlobalSettingsPanel.jLabel1.text=Signatures
FileTypeIdGlobalSettingsPanel.editTypeButton.text=Edit Type FileTypeIdGlobalSettingsPanel.editTypeButton.text=Edit Type
AddFileTypePanel.mimeTypeTextField.text= AddFileTypePanel.mimeTypeTextField.text=
AddFileTypePanel.mimeTypeLabel.text=MIME Type AddFileTypePanel.mimeTypeLabel.text=MIME Type
@ -72,4 +70,6 @@ AddFileTypePanel.postHitCheckBox.text=Alert as an "Interesting File" when found
AddFileTypePanel.setNameLabel.text=Set Name AddFileTypePanel.setNameLabel.text=Set Name
AddFileTypePanel.setNameTextField.text= AddFileTypePanel.setNameTextField.text=
FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=Cannot make changes to file type definitions when ingest is running! FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=Cannot make changes to file type definitions when ingest is running!
FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy can automatically detect many file types. Add your custom file types here. FileTypeIdGlobalSettingsPanel.descriptionLabel.text=Autopsy can automatically detect many file types. Add your custom file types here.
FileTypeIdGlobalSettingsPanel.customTypesLabel.text=Custom MIME Types:
FileTypeIdGlobalSettingsPanel.signaturesLabel.text=Signatures

View File

@ -83,8 +83,8 @@ FilesSetRulePanel.nameTextField.text=
FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional): FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional):
FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule. FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule.
FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0} FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0}
FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, ", <, or > unless it is a regular expression. FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, \", <, or > unless it is a regular expression.
FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, ", <, or > unless it is a regular expression. FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, \", <, or > unless it is a regular expression.
FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0} FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0}
FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists. FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists.
FilesSetRulePanel.pathSeparatorInfoLabel.text=Folder must be in parent path. Use '/' to give consecutive names FilesSetRulePanel.pathSeparatorInfoLabel.text=Folder must be in parent path. Use '/' to give consecutive names
@ -109,21 +109,14 @@ FilesSetDefsPanel.ingest.deleteSetButton.text=Delete Filter
FilesSetDefsPanel.interesting.jLabel6.text=Set Details FilesSetDefsPanel.interesting.jLabel6.text=Set Details
FilesSetDefsPanel.ingest.jLabel6.text=Filter Details FilesSetDefsPanel.ingest.jLabel6.text=Filter Details
FilesSetDefsPanel.newRuleButton.text=New Rule FilesSetDefsPanel.newRuleButton.text=New Rule
FilesSetDefsPanel.jLabel8.text=File Size:
FilesSetDefsPanel.jLabel7.text=MIME Type:
FilesSetDefsPanel.rulePathConditionRegexCheckBox.text=Regex FilesSetDefsPanel.rulePathConditionRegexCheckBox.text=Regex
FilesSetDefsPanel.jLabel4.text=Path Substring:
FilesSetDefsPanel.jLabel1.text=Rule Details
FilesSetDefsPanel.dirsRadioButton.text=Directories FilesSetDefsPanel.dirsRadioButton.text=Directories
FilesSetDefsPanel.jLabel2.text=File Type:
FilesSetDefsPanel.deleteRuleButton.text=Delete Rule FilesSetDefsPanel.deleteRuleButton.text=Delete Rule
FilesSetDefsPanel.fileNameRegexCheckbox.text=Substring / Regex FilesSetDefsPanel.fileNameRegexCheckbox.text=Substring / Regex
FilesSetDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files FilesSetDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files
FilesSetDefsPanel.rulePathConditionTextField.text= FilesSetDefsPanel.rulePathConditionTextField.text=
FilesSetDefsPanel.fileNameRadioButton.text=Full Name FilesSetDefsPanel.fileNameRadioButton.text=Full Name
FilesSetDefsPanel.jLabel5.text=Description:
FilesSetDefsPanel.fileNameTextField.text= FilesSetDefsPanel.fileNameTextField.text=
FilesSetDefsPanel.jLabel3.text=Name:
FilesSetDefsPanel.fileNameExtensionRadioButton.text=Extension Only FilesSetDefsPanel.fileNameExtensionRadioButton.text=Extension Only
FilesSetDefsPanel.rulesListLabel.text=Rules: FilesSetDefsPanel.rulesListLabel.text=Rules:
FilesSetDefsPanel.editRuleButton.text=Edit Rule FilesSetDefsPanel.editRuleButton.text=Edit Rule
@ -140,3 +133,10 @@ FilesSetDefsPanel.modifiedDateLabel.text=Modified Within:
FilesSetDefsPanel.daysIncludedTextField.text= FilesSetDefsPanel.daysIncludedTextField.text=
FilesSetDefsPanel.daysIncludedLabel.text=day(s) FilesSetDefsPanel.daysIncludedLabel.text=day(s)
FilesSetRulePanel.daysIncludedLabel.text=day(s) FilesSetRulePanel.daysIncludedLabel.text=day(s)
FilesSetDefsPanel.nameLabel.text=Name:
FilesSetDefsPanel.descriptionLabel.text=Description:
FilesSetDefsPanel.fileTypeLabel.text=File Type:
FilesSetDefsPanel.ruleLabel.text=Rule Details
FilesSetDefsPanel.pathLabel.text=Path Substring:
FilesSetDefsPanel.mimeTypeLabel.text=MIME Type:
FilesSetDefsPanel.fileSizeLabel.text=File Size:

View File

@ -21,7 +21,7 @@ PhotoRecIngestModule.complete.totalParsetime=Total Parsing Time:
PhotoRecIngestModule.complete.photoRecResults=PhotoRec Results PhotoRecIngestModule.complete.photoRecResults=PhotoRec Results
PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg=PhotoRec error processing {0} with {1} Not enough space on primary disk to save unallocated space. PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg=PhotoRec error processing {0} with {1} Not enough space on primary disk to save unallocated space.
PhotoRecIngestModule.cancelledByUser=PhotoRec cancelled by user. PhotoRecIngestModule.cancelledByUser=PhotoRec cancelled by user.
PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value = {0} when scanning {1} PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value \= {0} when scanning {1}
PhotoRecIngestModule.error.msg=Error processing {0} with PhotoRec carver. PhotoRecIngestModule.error.msg=Error processing {0} with PhotoRec carver.
PhotoRecIngestModule.complete.numberOfErrors=Number of Errors while Carving: PhotoRecIngestModule.complete.numberOfErrors=Number of Errors while Carving:
PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings

View File

@ -5,8 +5,8 @@ ReportHTML.getName.text=HTML Report
ReportHTML.getDesc.text=A report about results and tagged items in HTML format. ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
ReportHTML.writeIndex.title=for case {0} ReportHTML.writeIndex.title=for case {0}
ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup. ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup.
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href="content\nav.html">the navigation page</a> for artifact links, ReportHTML.writeIndex.noFrames.seeNav=Please see <a href\="content\nav.html">the navigation page</a> for artifact links,
ReportHTML.writeIndex.seeSum=and <a href="contentsummary.html">the summary page</a> for a case summary. ReportHTML.writeIndex.seeSum=and <a href\="content\summary.html">the summary page</a> for a case summary.
ReportHTML.writeNav.title=Report Navigation ReportHTML.writeNav.title=Report Navigation
ReportHTML.writeNav.h1=Report Navigation ReportHTML.writeNav.h1=Report Navigation
ReportHTML.writeNav.summary=Case Summary ReportHTML.writeNav.summary=Case Summary
@ -16,7 +16,7 @@ ReportHTML.writeSum.caseNumber=Case Number:
ReportHTML.writeSum.caseNumImages=Number of data sources in case: ReportHTML.writeSum.caseNumImages=Number of data sources in case:
ReportHTML.writeSum.examiner=Examiner: ReportHTML.writeSum.examiner=Examiner:
ReportHTML.writeSum.title=Case Summary ReportHTML.writeSum.title=Case Summary
ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed!</span> ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed\!</span>
# #
# autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum, # autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum,
# examiner as a regex signature to skip report.html and summary.html # examiner as a regex signature to skip report.html and summary.html

View File

@ -19,3 +19,4 @@ TranslationContentPanel.ocrLabel.text=OCR:
TranslationOptionsPanelController.moduleErr=Module Error TranslationOptionsPanelController.moduleErr=Module Error
TranslationOptionsPanelController.moduleErr.msg=A module caused an error listening to TranslationSettingsPanelController updates. See log to determine which module. Some data could be incomplete. TranslationOptionsPanelController.moduleErr.msg=A module caused an error listening to TranslationSettingsPanelController updates. See log to determine which module. Some data could be incomplete.
TranslationContentPanel.showLabel.text=Show: TranslationContentPanel.showLabel.text=Show:
TranslationContentPanel.jSepLarge1.AccessibleContext.accessibleName=

View File

@ -89,6 +89,10 @@ AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the c
AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled
AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist
AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log
# {0} - case db status
# {1} - search svc Status
# {2} - coord svc Status
# {3} - msg broker status
AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3} AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3}
AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down
AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown
@ -182,16 +186,22 @@ DeleteCaseTask.progress.acquiringManifestLocks=Acquiring exclusive manifest file
DeleteCaseTask.progress.connectingToCoordSvc=Connecting to the coordination service... DeleteCaseTask.progress.connectingToCoordSvc=Connecting to the coordination service...
DeleteCaseTask.progress.deletingCaseDirCoordSvcNode=Deleting case directory znode... DeleteCaseTask.progress.deletingCaseDirCoordSvcNode=Deleting case directory znode...
DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode... DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode...
# {0} - data source path
DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}... DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}...
DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode... DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode...
# {0} - manifest file path
DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}... DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}...
# {0} - manifest file path
DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}... DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}...
DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode... DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode...
DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths... DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths...
# {0} - manifest file path
DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}... DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}...
DeleteCaseTask.progress.openingCaseDatabase=Opening the case database... DeleteCaseTask.progress.openingCaseDatabase=Opening the case database...
DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file... DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file...
# {0} - manifest file path
DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}...
# {0} - manifest file path
DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}...
DeleteCaseTask.progress.startMessage=Starting deletion... DeleteCaseTask.progress.startMessage=Starting deletion...
DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes
@ -207,6 +217,7 @@ DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orph
DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup
DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes
DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service
# {0} - node path
DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0} DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0}
DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes
DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes
@ -215,6 +226,7 @@ HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-use
OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted. OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted.
OpenAutoIngestLogAction.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details. OpenAutoIngestLogAction.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details.
OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File
# {0} - caseErrorMessage
OpenCaseAction.errorMsg=Failed to open case: {0} OpenCaseAction.errorMsg=Failed to open case: {0}
OpenCaseAction.menuItemText=Open OpenCaseAction.menuItemText=Open
OpenIDE-Module-Long-Description=This module contains features that are being developed by Basis Technology and are not part of the default Autopsy distribution. You can enable this module to use the new features. The features should be stable, but their exact behavior and API are subject to change.\n\nWe make no guarantee that the API of this module will not change, so developers should be careful when relying on it. OpenIDE-Module-Long-Description=This module contains features that are being developed by Basis Technology and are not part of the default Autopsy distribution. You can enable this module to use the new features. The features should be stable, but their exact behavior and API are subject to change.\n\nWe make no guarantee that the API of this module will not change, so developers should be careful when relying on it.

View File

@ -75,6 +75,7 @@ MultiUserTestTool.unableCreatFile=Unable to create a file in case output directo
MultiUserTestTool.unableToCheckService=Unable to check Multi User service state: {0} MultiUserTestTool.unableToCheckService=Unable to check Multi User service state: {0}
MultiUserTestTool.unableToCreateCase=Unable to create case MultiUserTestTool.unableToCreateCase=Unable to create case
MultiUserTestTool.unableToInitializeDatabase=Case database was not successfully initialized MultiUserTestTool.unableToInitializeDatabase=Case database was not successfully initialized
MultiUserTestTool.unableToInitializeFilTypeDetector=Unable to initialize File Type Detector
MultiUserTestTool.unableToReadDatabase=Unable to read from case database MultiUserTestTool.unableToReadDatabase=Unable to read from case database
MultiUserTestTool.unableToReadTestFileFromDatabase=Unable to read test file info from case database MultiUserTestTool.unableToReadTestFileFromDatabase=Unable to read test file info from case database
MultiUserTestTool.unableToRunIngest=Unable to run ingest on test data source MultiUserTestTool.unableToRunIngest=Unable to run ingest on test data source

View File

@ -36,7 +36,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found
KeywordSearchResultFactory.query.exception.msg=Could not perform the query KeywordSearchResultFactory.query.exception.msg=Could not perform the query
OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Display-Category=Ingest Module
OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
OpenIDE-Module-Name=KeywordSearch OpenIDE-Module-Name=KeywordSearch
OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Name_KeywordSearchOptions=Keyword Search
OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search
@ -360,24 +360,24 @@ DropdownListSearchPanel.jSaveSearchResults.text=Save search results
GlobalEditListPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. GlobalEditListPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes.
KeywordSearchGlobalLanguageSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. KeywordSearchGlobalLanguageSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes.
KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes.
ExtractedContentPanel.hitCountLabel.text=- ExtractedContentPanel.AccessibleContext.accessibleName=
ExtractedContentPanel.jLabel1.text=Text Source:
ExtractedContentPanel.hitNextButton.text=
ExtractedContentPanel.hitPreviousButton.text= ExtractedContentPanel.hitPreviousButton.text=
ExtractedContentPanel.hitButtonsLabel.text=Match
ExtractedContentPanel.hitTotalLabel.text=- ExtractedContentPanel.hitTotalLabel.text=-
ExtractedContentPanel.hitOfLabel.text=of ExtractedContentPanel.hitOfLabel.text=of
ExtractedContentPanel.hitNextButton.text= ExtractedContentPanel.hitCountLabel.text=-
ExtractedContentPanel.hitButtonsLabel.text=Match
ExtractedContentPanel.hitLabel.toolTipText= ExtractedContentPanel.hitLabel.toolTipText=
ExtractedContentPanel.hitLabel.text=Matches on page: ExtractedContentPanel.hitLabel.text=Matches on page:
ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pageNextButton.text=
ExtractedContentPanel.pagePreviousButton.actionCommand=pagePreviousButton ExtractedContentPanel.pagePreviousButton.actionCommand=pagePreviousButton
ExtractedContentPanel.pagePreviousButton.text= ExtractedContentPanel.pagePreviousButton.text=
ExtractedContentPanel.pageNextButton.text=
ExtractedContentPanel.pagesLabel.text=Page:
ExtractedContentPanel.pageTotalLabel.text=-
ExtractedContentPanel.pageButtonsLabel.text=Page ExtractedContentPanel.pageButtonsLabel.text=Page
ExtractedContentPanel.pageTotalLabel.text=-
ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageOfLabel.text=of
ExtractedContentPanel.jLabel1.text=Text Source: ExtractedContentPanel.pageCurLabel.text=-
ExtractedContentPanel.AccessibleContext.accessibleName= ExtractedContentPanel.pagesLabel.text=Page:
TextZoomPanel.zoomInButton.text= TextZoomPanel.zoomInButton.text=
TextZoomPanel.zoomOutButton.text= TextZoomPanel.zoomOutButton.text=
TextZoomPanel.zoomResetButton.text=Reset TextZoomPanel.zoomResetButton.text=Reset

View File

@ -5,10 +5,15 @@ ChromeCacheExtract_adding_artifacts_msg=Chrome Cache: Adding %d artifacts for an
ChromeCacheExtract_adding_extracted_files_msg=Chrome Cache: Adding %d extracted files for analysis. ChromeCacheExtract_adding_extracted_files_msg=Chrome Cache: Adding %d extracted files for analysis.
ChromeCacheExtract_loading_files_msg=Chrome Cache: Loading files from %s. ChromeCacheExtract_loading_files_msg=Chrome Cache: Loading files from %s.
ChromeCacheExtractor.moduleName=ChromeCacheExtractor ChromeCacheExtractor.moduleName=ChromeCacheExtractor
# {0} - module name
# {1} - row number
# {2} - table length
# {3} - cache path
ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3} ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3}
DataSourceUsage_AndroidMedia=Android Media Card DataSourceUsage_AndroidMedia=Android Media Card
DataSourceUsage_DJU_Drone_DAT=DJI Internal SD Card DataSourceUsage_DJU_Drone_DAT=DJI Internal SD Card
DataSourceUsage_FlashDrive=Flash Drive DataSourceUsage_FlashDrive=Flash Drive
# {0} - OS name
DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0}) DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
DataSourceUsageAnalyzer.parentModuleName=Recent Activity DataSourceUsageAnalyzer.parentModuleName=Recent Activity
Extract.indexError.message=Failed to index artifact for keyword search. Extract.indexError.message=Failed to index artifact for keyword search.
@ -71,7 +76,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files
ExtractZone_Restricted=Restricted Sites Zone ExtractZone_Restricted=Restricted Sites Zone
ExtractZone_Trusted=Trusted Sites Zone ExtractZone_Trusted=Trusted Sites Zone
OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Display-Category=Ingest Module
OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy.
OpenIDE-Module-Name=RecentActivity OpenIDE-Module-Name=RecentActivity
OpenIDE-Module-Short-Description=Recent Activity finder ingest module OpenIDE-Module-Short-Description=Recent Activity finder ingest module
Chrome.moduleName=Chrome Chrome.moduleName=Chrome
@ -202,6 +207,7 @@ Recently_Used_Artifacts_Officedocs=Recently opened according to Office MRU
Recently_Used_Artifacts_Winrar=Recently opened according to WinRAR MRU Recently_Used_Artifacts_Winrar=Recently opened according to WinRAR MRU
RegRipperFullNotFound=Full version RegRipper executable not found. RegRipperFullNotFound=Full version RegRipper executable not found.
RegRipperNotFound=Autopsy RegRipper executable not found. RegRipperNotFound=Autopsy RegRipper executable not found.
# {0} - file name
SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}. SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
SearchEngineURLQueryAnalyzer.engineName.none=NONE SearchEngineURLQueryAnalyzer.engineName.none=NONE

View File

@ -418,10 +418,31 @@ class ExtractRegistry extends Extract {
String errFilePath = outFilePathBase + "-full.err.txt"; //NON-NLS String errFilePath = outFilePathBase + "-full.err.txt"; //NON-NLS
logger.log(Level.INFO, "Writing Full RegRipper results to: {0}", regOutputFiles.fullPlugins); //NON-NLS logger.log(Level.INFO, "Writing Full RegRipper results to: {0}", regOutputFiles.fullPlugins); //NON-NLS
executeRegRipper(rrFullCmd, rrFullHome, regFilePath, fullType, regOutputFiles.fullPlugins, errFilePath); executeRegRipper(rrFullCmd, rrFullHome, regFilePath, fullType, regOutputFiles.fullPlugins, errFilePath);
try {
scanErrorLogs(errFilePath);
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unable to run RegRipper", ex); //NON-NLS
this.addErrorMessage(NbBundle.getMessage(this.getClass(), "ExtractRegistry.execRegRip.errMsg.failedAnalyzeRegFile", this.getName()));
}
} }
return regOutputFiles; return regOutputFiles;
} }
private void scanErrorLogs(String errFilePath) throws IOException {
File regfile = new File(errFilePath);
try (BufferedReader reader = new BufferedReader(new FileReader(regfile))) {
String line = reader.readLine();
while (line != null) {
line = line.trim();
if (line.toLowerCase().contains("error") || line.toLowerCase().contains("@inc")) {
logger.log(Level.WARNING, "Regripper file {0} contains errors from run", errFilePath); //NON-NLS
}
line = reader.readLine();
}
}
}
private void executeRegRipper(List<String> regRipperPath, Path regRipperHomeDir, String hiveFilePath, String hiveFileType, String outputFile, String errFile) { private void executeRegRipper(List<String> regRipperPath, Path regRipperHomeDir, String hiveFilePath, String hiveFileType, String outputFile, String errFile) {
try { try {
List<String> commandLine = new ArrayList<>(); List<String> commandLine = new ArrayList<>();
@ -1497,11 +1518,11 @@ class ExtractRegistry extends Extract {
line = line.trim(); line = line.trim();
// Reading to the SECTION DIVIDER to get next section of records to process. Dates appear to have // Reading to the SECTION DIVIDER to get next section of records to process. Dates appear to have
// multiple spaces in them that makes it harder to parse so next section will be easier to parse // multiple spaces in them that makes it harder to parse so next section will be easier to parse
while (!line.contains(SECTION_DIVIDER) && !line.contains("MSOffice version not found.")) { while (!line.contains(SECTION_DIVIDER)) {
line = reader.readLine(); line = reader.readLine();
} }
line = reader.readLine(); line = reader.readLine();
while (!line.contains(SECTION_DIVIDER) && !line.contains("MSOffice version not found.")) { while (!line.contains(SECTION_DIVIDER)) {
// record has the following format // record has the following format
// 1294283922|REG|||OfficeDocs2010 - F:\Windows_time_Rules_xp.doc // 1294283922|REG|||OfficeDocs2010 - F:\Windows_time_Rules_xp.doc
String tokens[] = line.split("\\|"); String tokens[] = line.split("\\|");

View File

@ -1,5 +1,5 @@
#Updated by build script #Updated by build script
#Tue, 12 Nov 2019 17:21:46 -0500 #Fri, 12 Jun 2020 14:50:38 -0400
LBL_splash_window_title=Starting Autopsy LBL_splash_window_title=Starting Autopsy
SPLASH_HEIGHT=314 SPLASH_HEIGHT=314
SPLASH_WIDTH=538 SPLASH_WIDTH=538
@ -8,4 +8,4 @@ SplashRunningTextBounds=0,289,538,18
SplashRunningTextColor=0x0 SplashRunningTextColor=0x0
SplashRunningTextFontSize=19 SplashRunningTextFontSize=19
currentVersion=Autopsy 4.13.0 currentVersion=Autopsy 4.15.0

View File

@ -1,4 +1,4 @@
#Updated by build script #Updated by build script
#Tue, 12 Nov 2019 17:21:46 -0500 #Fri, 12 Jun 2020 14:50:38 -0400
CTL_MainWindow_Title=Autopsy 4.13.0 CTL_MainWindow_Title=Autopsy 4.15.0
CTL_MainWindow_Title_No_Project=Autopsy 4.13.0 CTL_MainWindow_Title_No_Project=Autopsy 4.15.0

View File

@ -57,9 +57,11 @@ sub pluginmain {
::rptMsg($win_path); ::rptMsg($win_path);
::rptMsg("LastWrite Time ".gmtime($win->get_timestamp())." (UTC)"); ::rptMsg("LastWrite Time ".gmtime($win->get_timestamp())." (UTC)");
my $cn; my $cn;
if (defined($win->get_value("ComputerName"))) {
if ($cn = $win->get_value("ComputerName")->get_data()) { if ($cn = $win->get_value("ComputerName")->get_data()) {
::rptMsg("ComputerName = ".$cn); ::rptMsg("ComputerName = ".$cn);
} }
}
else { else {
::rptMsg("ComputerName value not found."); ::rptMsg("ComputerName value not found.");
} }
@ -81,9 +83,15 @@ sub pluginmain {
::rptMsg(" ".$evpath); ::rptMsg(" ".$evpath);
::rptMsg(" LastWrite Time ".gmtime($evlog->get_timestamp())." (UTC)"); ::rptMsg(" LastWrite Time ".gmtime($evlog->get_timestamp())." (UTC)");
::rptMsg(" Configuration Settings"); ::rptMsg(" Configuration Settings");
if (defined($evlog->get_value('File'))) {
::rptMsg(" Log location: ".$evlog->get_value('File')->get_data()); ::rptMsg(" Log location: ".$evlog->get_value('File')->get_data());
}
if (defined($evlog->get_value('MaxSize'))) {
::rptMsg(" Log Size: ".$evlog->get_value('MaxSize')->get_data()." Bytes"); ::rptMsg(" Log Size: ".$evlog->get_value('MaxSize')->get_data()." Bytes");
}
if (defined($evlog->get_value('AutoBackupLogFiles'))) {
($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled") ($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled")
}
} }
else { else {
::rptMsg($logname->get_name()." Event Log not found."); ::rptMsg($logname->get_name()." Event Log not found.");

View File

@ -60,8 +60,13 @@ sub pluginmain {
::rptMsg(""); ::rptMsg("");
# Get Zones and various security settings # Get Zones and various security settings
foreach my $n (0..4) { foreach my $n (0..4) {
if (defined($key->get_subkey('Zones\\'.$n))) {
$zone = $key->get_subkey('Zones\\'.$n); $zone = $key->get_subkey('Zones\\'.$n);
if (defined($zone->get_value("PMDisplayName"))) {
::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); ::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data());
} else {
::rptMsg("Zone ".$n.": ".$zone->get_value("DisplayName")->get_data()." - ".$zone->get_value("Description")->get_data());
}
::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC")); ::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC"));
my @vals = $zone->get_list_of_values(); my @vals = $zone->get_list_of_values();
@ -72,13 +77,15 @@ sub pluginmain {
my $data = $v->get_data(); my $data = $v->get_data();
$name = "**".$name if ($name eq "1609" && $data == 0); $name = "**".$name if ($name eq "1609" && $data == 0);
my $str = sprintf "%6s 0x%08x",$name,$data; my $str = sprintf "%6s 0x%08x",$name,$data;
# ::rptMsg(" ".$name." ".$data." ".$zones{$data}); # ::rptMsg(" ".$name." ".$data." ".$zones{$data});
::rptMsg($str." ".$zones{$data}); ::rptMsg($str." ".$zones{$data});
} }
} }
::rptMsg(""); ::rptMsg("");
} }
}
# Now, get ZoneMap settings # Now, get ZoneMap settings
if (defined($key->get_subkey('ZoneMap\\Domains'))) {
my $zonemap = $key->get_subkey('ZoneMap\\Domains'); my $zonemap = $key->get_subkey('ZoneMap\\Domains');
my @domains = $zonemap->get_list_of_subkeys(); my @domains = $zonemap->get_list_of_subkeys();
if (scalar(@domains) > 0) { if (scalar(@domains) > 0) {
@ -94,6 +101,7 @@ sub pluginmain {
::rptMsg(""); ::rptMsg("");
} }
} }
}
} }
else { else {
# ::rptMsg($key_path." not found."); # ::rptMsg($key_path." not found.");

View File

@ -47,8 +47,10 @@ sub pluginmain {
if ($key = $root_key->get_subkey($key_path)) { if ($key = $root_key->get_subkey($key_path)) {
::rptMsg("SearchScopes"); ::rptMsg("SearchScopes");
::rptMsg($key_path); ::rptMsg($key_path);
if (defined($key->get_value("DefaultScope"))) {
::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data()); ::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data());
::rptMsg(""); ::rptMsg("");
}
# ::rptMsg("LastWrite Time ".gmtime($key->get_timestamp())." (UTC)"); # ::rptMsg("LastWrite Time ".gmtime($key->get_timestamp())." (UTC)");
my @subkeys = $key->get_list_of_subkeys(); my @subkeys = $key->get_list_of_subkeys();
if (scalar(@subkeys) > 0) { if (scalar(@subkeys) > 0) {

View File

@ -480,10 +480,11 @@ sub parseDeviceEntry {
# Version 3 = XP # Version 3 = XP
if ($ver == 3) { if ($ver == 3) {
if (length($data) > ($ofs + 6)) {
my $guid1 = parseGUID(substr($data,$ofs + 6,16)); my $guid1 = parseGUID(substr($data,$ofs + 6,16));
my $guid2 = parseGUID(substr($data,$ofs + 6 + 16,16)); my $guid2 = parseGUID(substr($data,$ofs + 6 + 16,16));
$item{name} = $guid1."\\".$guid2 $item{name} = $guid1."\\".$guid2
}
} }
# Version 8 = Win7 # Version 8 = Win7
elsif ($ver == 8) { elsif ($ver == 8) {