mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
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:
commit
c3a6828931
@ -252,6 +252,21 @@ public class Persona {
|
||||
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
|
||||
*
|
||||
@ -261,7 +276,10 @@ public class Persona {
|
||||
*/
|
||||
public void setName(String name) throws CentralRepoException {
|
||||
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());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public void delete() throws CentralRepoException {
|
||||
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
|
||||
*
|
||||
@ -448,6 +481,18 @@ public class Persona {
|
||||
public void removeAlias(PersonaAlias alias) throws CentralRepoException {
|
||||
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.
|
||||
@ -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
|
||||
*
|
||||
@ -486,6 +531,18 @@ public class Persona {
|
||||
public void removeMetadata(PersonaMetadata metadata) throws CentralRepoException {
|
||||
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.
|
||||
|
@ -363,6 +363,25 @@ public class PersonaAccount {
|
||||
String deleteClause = " DELETE FROM persona_accounts WHERE id = " + id;
|
||||
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
|
||||
|
@ -38,7 +38,7 @@ public class PersonaAlias {
|
||||
"SELECT pa.id, pa.persona_id, pa.alias, pa.justification, pa.confidence_id, pa.date_added, pa.examiner_id, e.login_name, e.display_name "
|
||||
+ "FROM persona_alias as pa "
|
||||
+ "INNER JOIN examiners as e ON e.id = pa.examiner_id ";
|
||||
|
||||
|
||||
private final long id;
|
||||
private final long personaId;
|
||||
private final String alias;
|
||||
@ -144,6 +144,25 @@ public class PersonaAlias {
|
||||
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.
|
||||
*/
|
||||
|
@ -155,6 +155,24 @@ public class PersonaMetadata {
|
||||
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.
|
||||
*/
|
||||
|
@ -28,6 +28,24 @@ AddAliasDialog.accountsLbl.text=Account:
|
||||
AddAliasDialog.okBtn.text=OK
|
||||
AddAliasDialog.cancelBtn.text=Cancel
|
||||
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.justificationTextField.text=
|
||||
PersonaAccountDialog.justificationLbl.text=Justification:
|
||||
@ -52,3 +70,6 @@ PersonaMetadataDialog.nameTextField.text=
|
||||
PersonaMetadataDialog.nameLbl.text=Name:
|
||||
PersonaMetadataDialog.okBtn.text=OK
|
||||
PersonaMetadataDialog.cancelBtn.text=Cancel
|
||||
PersonaDetailsPanel.editAccountBtn.text=Edit
|
||||
PersonaDetailsPanel.editMetadataBtn.text=Edit
|
||||
PersonaDetailsPanel.editAliasBtn.text=Edit
|
||||
|
@ -1,36 +1,42 @@
|
||||
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_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_PersonaManagerTopComponentAction=Persona Manager
|
||||
CTL_PersonaDetailsTopComponent=Persona Details
|
||||
OpenPersonasAction.displayName=Persona Manager
|
||||
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_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_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_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_failure_msg=Central Repository account search failed
|
||||
PersonaAccountDialog_search_failure_msg=Central Repository account search failed.
|
||||
PersonaAccountDialog_search_failure_Title=Account add failure
|
||||
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_empty_msg=An alias cannot be empty.
|
||||
PersonaAliasDialog_empty_Title=Empty alias
|
||||
PersonaDetailsDialogCreateTitle=Create Persona
|
||||
PersonaDetailsDialogEditTitle=Edit 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_empty_justification_msg=The justification field cannot be empty
|
||||
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_load_exception_msg=Failed to load persona
|
||||
PersonaDetailsPanel_load_exception_msg=Failed to load persona.
|
||||
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
|
||||
PersonaManagerTopComponent.createBtn.text=New Persona
|
||||
PersonaManagerTopComponent.searchBtn.text=Search
|
||||
@ -43,8 +49,6 @@ PersonaManagerTopComponent.searchField.text=
|
||||
PersonaManagerTopComponent.editBtn.text=Edit Persona
|
||||
PersonaDetailsDialog.cancelBtn.text=Cancel
|
||||
PersonaDetailsDialog.okBtn.text=OK
|
||||
PersonaDetailsPanel.deleteCaseBtn.text=Delete
|
||||
PersonaDetailsPanel.addCaseBtn.text=Add
|
||||
PersonaDetailsPanel.casesLbl.text=Cases found in:
|
||||
PersonaDetailsPanel.deleteAliasBtn.text=Delete
|
||||
PersonaDetailsPanel.addAliasBtn.text=Add
|
||||
@ -61,6 +65,24 @@ AddAliasDialog.accountsLbl.text=Account:
|
||||
AddAliasDialog.okBtn.text=OK
|
||||
AddAliasDialog.cancelBtn.text=Cancel
|
||||
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.justificationTextField.text=
|
||||
PersonaAccountDialog.justificationLbl.text=Justification:
|
||||
@ -85,8 +107,13 @@ PersonaMetadataDialog.nameTextField.text=
|
||||
PersonaMetadataDialog.nameLbl.text=Name:
|
||||
PersonaMetadataDialog.okBtn.text=OK
|
||||
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_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
|
||||
|
@ -23,11 +23,11 @@ import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.ListCellRenderer;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
|
||||
@ -46,27 +46,50 @@ public class PersonaAccountDialog extends JDialog {
|
||||
private static final Logger logger = Logger.getLogger(PersonaAccountDialog.class.getName());
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer();
|
||||
private final PersonaDetailsPanel pdp;
|
||||
|
||||
|
||||
private PersonaDetailsPanel.PAccount currentAccount = null;
|
||||
|
||||
/**
|
||||
* Creates new add account dialog
|
||||
*/
|
||||
@Messages({"PersonaAccountDialog.title.text=Add Account",})
|
||||
public PersonaAccountDialog(PersonaDetailsPanel pdp) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||
super(SwingUtilities.windowForComponent(pdp),
|
||||
Bundle.PersonaAccountDialog_title_text(),
|
||||
true);
|
||||
ModalityType.APPLICATION_MODAL);
|
||||
this.pdp = pdp;
|
||||
|
||||
initComponents();
|
||||
typeComboBox.setRenderer(TYPE_CHOICE_RENDERER);
|
||||
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 {
|
||||
|
||||
@ -80,11 +103,10 @@ public class PersonaAccountDialog extends JDialog {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Messages({
|
||||
"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() {
|
||||
Collection<CentralRepoAccountType> allAccountTypes;
|
||||
try {
|
||||
@ -92,9 +114,9 @@ public class PersonaAccountDialog extends JDialog {
|
||||
} catch (CentralRepoException e) {
|
||||
logger.log(Level.SEVERE, "Failed to access central repository", e);
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaAccountDialog_get_types_exception_Title(),
|
||||
Bundle.PersonaAccountDialog_get_types_exception_msg(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
Bundle.PersonaAccountDialog_get_types_exception_Title(),
|
||||
Bundle.PersonaAccountDialog_get_types_exception_msg(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
return new CentralRepoAccountType[0];
|
||||
}
|
||||
return allAccountTypes.toArray(new CentralRepoAccountType[0]);
|
||||
@ -303,17 +325,23 @@ public class PersonaAccountDialog extends JDialog {
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pdp.addAccount(
|
||||
result,
|
||||
justificationTextField.getText(),
|
||||
(Persona.Confidence) confidenceComboBox.getSelectedItem())) {
|
||||
|
||||
Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
|
||||
String justification = justificationTextField.getText();
|
||||
|
||||
if (currentAccount != null) {
|
||||
currentAccount.confidence = confidence;
|
||||
currentAccount.justification = justification;
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaAccountDialog_dup_msg(),
|
||||
Bundle.PersonaAccountDialog_dup_Title(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
if (pdp.addAccount(result, justification, confidence)) {
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaAccountDialog_dup_msg(),
|
||||
Bundle.PersonaAccountDialog_dup_Title(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_okBtnActionPerformed
|
||||
|
||||
@ -324,7 +352,7 @@ public class PersonaAccountDialog extends JDialog {
|
||||
private void identifierTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_identifierTextFieldActionPerformed
|
||||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_identifierTextFieldActionPerformed
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton cancelBtn;
|
||||
private javax.swing.JComboBox<org.sleuthkit.autopsy.centralrepository.datamodel.Persona.Confidence> confidenceComboBox;
|
||||
|
@ -19,8 +19,8 @@
|
||||
package org.sleuthkit.autopsy.centralrepository.persona;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
||||
@ -35,20 +35,39 @@ public class PersonaAliasDialog extends JDialog {
|
||||
|
||||
private final PersonaDetailsPanel pdp;
|
||||
|
||||
private PersonaDetailsPanel.PAlias currentAlias = null;
|
||||
|
||||
/**
|
||||
* Creates new add alias dialog
|
||||
*/
|
||||
@Messages({"PersonaAliasDialog.title.text=Add Alias",})
|
||||
public PersonaAliasDialog(PersonaDetailsPanel pdp) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||
super(SwingUtilities.windowForComponent(pdp),
|
||||
Bundle.PersonaAliasDialog_title_text(),
|
||||
true);
|
||||
ModalityType.APPLICATION_MODAL);
|
||||
this.pdp = pdp;
|
||||
|
||||
initComponents();
|
||||
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.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
@ -176,9 +195,18 @@ public class PersonaAliasDialog extends JDialog {
|
||||
}
|
||||
|
||||
@Messages({
|
||||
"PersonaAliasDialog_empty_Title=Empty alias",
|
||||
"PersonaAliasDialog_empty_msg=An alias cannot be empty.",
|
||||
"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
|
||||
if (aliasTextField.getText().isEmpty()) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaAliasDialog_empty_msg(),
|
||||
Bundle.PersonaAliasDialog_empty_Title(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
if (justificationTextField.getText().isEmpty()) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaDetailsPanel_empty_justification_msg(),
|
||||
@ -186,16 +214,23 @@ public class PersonaAliasDialog extends JDialog {
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
if (pdp.addAlias(
|
||||
aliasTextField.getText(),
|
||||
justificationTextField.getText(),
|
||||
(Persona.Confidence) confidenceComboBox.getSelectedItem())) {
|
||||
|
||||
Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
|
||||
String justification = justificationTextField.getText();
|
||||
|
||||
if (currentAlias != null) {
|
||||
currentAlias.confidence = confidence;
|
||||
currentAlias.justification = justification;
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
if (pdp.addAlias(aliasTextField.getText(), justification, confidence)) {
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaAliasDialog_dup_msg(),
|
||||
Bundle.PersonaAliasDialog_dup_Title(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_okBtnActionPerformed
|
||||
|
||||
|
@ -37,9 +37,9 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="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">
|
||||
<Component id="detailsPanel" alignment="0" max="32767" attributes="0"/>
|
||||
<EmptySpace min="0" pref="617" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@ -64,12 +64,7 @@
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="accountsTablePane" alignment="1" pref="549" 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="accountsTablePane" alignment="1" pref="605" max="32767" attributes="0"/>
|
||||
<Component id="accountsLbl" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="metadataLabel" alignment="0" 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="casesLbl" alignment="0" 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="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"/>
|
||||
<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"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="addMetadataBtn" min="-2" 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"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="addAliasBtn" min="-2" 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"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</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>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
@ -105,7 +125,19 @@
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="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"/>
|
||||
<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">
|
||||
<Component id="nameLbl" 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">
|
||||
<Component id="addAccountBtn" 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>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="metadataLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="metadataTablePane" min="-2" pref="66" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="deleteMetadataBtn" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="addMetadataBtn" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="addMetadataBtn" alignment="3" 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>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="aliasesLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="aliasesTablePane" min="-2" pref="74" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="deleteAliasBtn" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="addAliasBtn" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="addAliasBtn" alignment="3" 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>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="casesLbl" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace 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>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="nameLbl">
|
||||
<Properties>
|
||||
<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, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nameFieldActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="accountsLbl">
|
||||
<Properties>
|
||||
@ -196,6 +273,14 @@
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="deleteAccountBtn">
|
||||
<Properties>
|
||||
<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"/>
|
||||
</Properties>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="deleteMetadataBtn">
|
||||
<Properties>
|
||||
<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"/>
|
||||
</Properties>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="deleteAliasBtn">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
|
@ -20,9 +20,13 @@ package org.sleuthkit.autopsy.centralrepository.persona;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JOptionPane;
|
||||
@ -34,7 +38,9 @@ import org.openide.windows.TopComponent;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.RetainLocation;
|
||||
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.CentralRepository;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
||||
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<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 List<PersonaAccount> currentAccounts = new ArrayList<>();
|
||||
private List<PersonaMetadata> currentMetadata = new ArrayList<>();
|
||||
@ -87,6 +97,19 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
addAccountBtn.addActionListener((ActionEvent e) -> {
|
||||
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) -> {
|
||||
int selectedRow = accountsTable.getSelectedRow();
|
||||
if (selectedRow != -1) {
|
||||
@ -94,21 +117,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
if (selectedRow >= currentAccounts.size()) {
|
||||
accountsToAdd.remove(selectedRow - currentAccounts.size());
|
||||
} else {
|
||||
accountsToRemove.add(currentAccounts.get(selectedRow));
|
||||
currentAccounts.remove(selectedRow);
|
||||
PersonaAccount toRemove = currentAccounts.get(selectedRow);
|
||||
accountsToEdit.remove(toRemove);
|
||||
accountsToRemove.add(toRemove);
|
||||
currentAccounts.remove(toRemove);
|
||||
}
|
||||
updateAccountsTable();
|
||||
}
|
||||
});
|
||||
accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
|
||||
handleSelectionChange(e, deleteAccountBtn, accountsTable);
|
||||
handleSelectionChange(e, editAccountBtn, deleteAccountBtn, accountsTable);
|
||||
});
|
||||
|
||||
// Metadata
|
||||
addMetadataBtn.addActionListener((ActionEvent e) -> {
|
||||
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) -> {
|
||||
int selectedRow = metadataTable.getSelectedRow();
|
||||
if (selectedRow != -1) {
|
||||
@ -116,21 +154,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
if (selectedRow >= currentMetadata.size()) {
|
||||
metadataToAdd.remove(selectedRow - currentMetadata.size());
|
||||
} else {
|
||||
metadataToRemove.add(currentMetadata.get(selectedRow));
|
||||
currentMetadata.remove(selectedRow);
|
||||
PersonaMetadata toRemove = currentMetadata.get(selectedRow);
|
||||
metadataToEdit.remove(toRemove);
|
||||
metadataToRemove.add(toRemove);
|
||||
currentMetadata.remove(toRemove);
|
||||
}
|
||||
updateMetadataTable();
|
||||
}
|
||||
});
|
||||
metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
|
||||
handleSelectionChange(e, deleteMetadataBtn, metadataTable);
|
||||
handleSelectionChange(e, editMetadataBtn, deleteMetadataBtn, metadataTable);
|
||||
});
|
||||
|
||||
// Aliases
|
||||
addAliasBtn.addActionListener((ActionEvent e) -> {
|
||||
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) -> {
|
||||
int selectedRow = aliasesTable.getSelectedRow();
|
||||
if (selectedRow != -1) {
|
||||
@ -138,33 +191,48 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
if (selectedRow >= currentAliases.size()) {
|
||||
aliasesToAdd.remove(selectedRow - currentAliases.size());
|
||||
} else {
|
||||
aliasesToRemove.add(currentAliases.get(selectedRow));
|
||||
currentAliases.remove(selectedRow);
|
||||
PersonaAlias toRemove = currentAliases.get(selectedRow);
|
||||
aliasesToEdit.remove(toRemove);
|
||||
aliasesToRemove.add(toRemove);
|
||||
currentAliases.remove(toRemove);
|
||||
}
|
||||
updateAliasesTable();
|
||||
}
|
||||
});
|
||||
aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
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()) {
|
||||
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
|
||||
*/
|
||||
private class PAccount {
|
||||
class PAccount {
|
||||
|
||||
private final CentralRepoAccount account;
|
||||
private final String justification;
|
||||
private final Persona.Confidence confidence;
|
||||
CentralRepoAccount account;
|
||||
String justification;
|
||||
Persona.Confidence confidence;
|
||||
|
||||
PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
|
||||
this.account = account;
|
||||
@ -185,7 +253,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean addAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
|
||||
if (!accountExists(account)) {
|
||||
@ -199,12 +267,12 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
/**
|
||||
* A data bucket class for yet-to-be-created PersonaMetadata
|
||||
*/
|
||||
private class PMetadata {
|
||||
class PMetadata {
|
||||
|
||||
private final String name;
|
||||
private final String value;
|
||||
private final String justification;
|
||||
private final Persona.Confidence confidence;
|
||||
String name;
|
||||
String value;
|
||||
String justification;
|
||||
Persona.Confidence confidence;
|
||||
|
||||
PMetadata(String name, String value, String justification, Persona.Confidence confidence) {
|
||||
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
|
||||
*/
|
||||
private class PAlias {
|
||||
class PAlias {
|
||||
|
||||
private final String alias;
|
||||
private final String justification;
|
||||
private final Persona.Confidence confidence;
|
||||
String alias;
|
||||
String justification;
|
||||
Persona.Confidence confidence;
|
||||
|
||||
PAlias(String alias, String justification, Persona.Confidence confidence) {
|
||||
this.alias = alias;
|
||||
@ -285,36 +353,55 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
private void initComponents() {
|
||||
|
||||
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();
|
||||
nameField = new javax.swing.JTextField();
|
||||
accountsLbl = new javax.swing.JLabel();
|
||||
accountsTablePane = new javax.swing.JScrollPane();
|
||||
accountsTable = new javax.swing.JTable();
|
||||
addAccountBtn = new javax.swing.JButton();
|
||||
editAccountBtn = new javax.swing.JButton();
|
||||
deleteAccountBtn = new javax.swing.JButton();
|
||||
metadataLabel = new javax.swing.JLabel();
|
||||
metadataTablePane = new javax.swing.JScrollPane();
|
||||
metadataTable = new javax.swing.JTable();
|
||||
addMetadataBtn = new javax.swing.JButton();
|
||||
editMetadataBtn = new javax.swing.JButton();
|
||||
deleteMetadataBtn = new javax.swing.JButton();
|
||||
aliasesLabel = new javax.swing.JLabel();
|
||||
aliasesTablePane = new javax.swing.JScrollPane();
|
||||
aliasesTable = new javax.swing.JTable();
|
||||
addAliasBtn = new javax.swing.JButton();
|
||||
editAliasBtn = new javax.swing.JButton();
|
||||
deleteAliasBtn = new javax.swing.JButton();
|
||||
casesLbl = new javax.swing.JLabel();
|
||||
casesTablePane = new javax.swing.JScrollPane();
|
||||
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
|
||||
|
||||
nameField.setEditable(false);
|
||||
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
|
||||
|
||||
@ -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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
deleteAliasBtn.setEnabled(false);
|
||||
|
||||
@ -401,11 +497,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE)
|
||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||
.addComponent(nameLbl)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(nameField))
|
||||
.addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 605, 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(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
@ -413,27 +505,59 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
.addComponent(aliasesTablePane)
|
||||
.addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.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.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||
.addComponent(addAccountBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(editAccountBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(deleteAccountBtn))
|
||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||
.addComponent(addMetadataBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(editMetadataBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(deleteMetadataBtn))
|
||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||
.addComponent(addAliasBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(editAliasBtn)
|
||||
.addGap(18, 18, 18)
|
||||
.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())
|
||||
);
|
||||
detailsPanelLayout.setVerticalGroup(
|
||||
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.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)
|
||||
.addComponent(nameLbl)
|
||||
.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)
|
||||
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(addAccountBtn)
|
||||
.addComponent(deleteAccountBtn))
|
||||
.addComponent(deleteAccountBtn)
|
||||
.addComponent(editAccountBtn))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(metadataLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.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(addMetadataBtn))
|
||||
.addComponent(editMetadataBtn))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(aliasesLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.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(addAliasBtn))
|
||||
.addComponent(editAliasBtn))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(casesLbl)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.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);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
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)
|
||||
.addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addGap(0, 617, Short.MAX_VALUE))
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
@ -486,10 +613,6 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
);
|
||||
}// </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
|
||||
private javax.swing.JLabel accountsLbl;
|
||||
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.JTable casesTable;
|
||||
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 deleteAliasBtn;
|
||||
private javax.swing.JButton deleteMetadataBtn;
|
||||
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.JTable metadataTable;
|
||||
private javax.swing.JScrollPane metadataTablePane;
|
||||
@ -516,14 +648,24 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
|
||||
@Messages({
|
||||
"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) {
|
||||
String examiner;
|
||||
String creationDate;
|
||||
String comment;
|
||||
String name;
|
||||
Collection<PersonaAccount> accounts;
|
||||
Collection<PersonaMetadata> metadata;
|
||||
Collection<PersonaAlias> aliases;
|
||||
Collection<CorrelationCase> cases;
|
||||
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();
|
||||
accounts = persona.getPersonaAccounts();
|
||||
metadata = persona.getMetadata();
|
||||
@ -538,6 +680,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
return;
|
||||
}
|
||||
this.currentPersona = persona;
|
||||
this.examinerField.setText(examiner);
|
||||
this.creationDateField.setText(creationDate);
|
||||
this.commentField.setText(comment);
|
||||
this.nameField.setText(name);
|
||||
this.currentAccounts.addAll(accounts);
|
||||
this.currentMetadata.addAll(metadata);
|
||||
@ -547,6 +692,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
|
||||
void clear() {
|
||||
currentPersona = null;
|
||||
examinerField.setText("");
|
||||
creationDateField.setText("");
|
||||
commentField.setText("");
|
||||
nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : "");
|
||||
currentAccounts = new ArrayList<>();
|
||||
currentMetadata = new ArrayList<>();
|
||||
@ -556,6 +704,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
metadataToAdd.clear();
|
||||
aliasesToAdd.clear();
|
||||
nameField.setEditable(false);
|
||||
commentField.setEditable(false);
|
||||
|
||||
initializeFields();
|
||||
|
||||
@ -565,6 +714,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
deleteAccountBtn.setEnabled(false);
|
||||
deleteMetadataBtn.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) {
|
||||
commentField.setEditable(enabled);
|
||||
nameField.setEditable(enabled);
|
||||
addAccountBtn.setEnabled(enabled);
|
||||
addMetadataBtn.setEnabled(enabled);
|
||||
addAliasBtn.setEnabled(enabled);
|
||||
|
||||
|
||||
addAccountBtn.setVisible(enabled);
|
||||
editAccountBtn.setVisible(enabled);
|
||||
deleteAccountBtn.setVisible(enabled);
|
||||
addMetadataBtn.setVisible(enabled);
|
||||
editMetadataBtn.setVisible(enabled);
|
||||
deleteMetadataBtn.setVisible(enabled);
|
||||
addAliasBtn.setVisible(enabled);
|
||||
editAliasBtn.setVisible(enabled);
|
||||
deleteAliasBtn.setVisible(enabled);
|
||||
}
|
||||
|
||||
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();
|
||||
updateMetadataTable();
|
||||
updateAliasesTable();
|
||||
@ -706,12 +874,14 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
}
|
||||
|
||||
@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_CentralRepoErr_msg=Failure to write to Central Repository",
|
||||
"PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository.",
|
||||
"PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure",
|
||||
"PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty",
|
||||
"PersonaDetailsPanel_EmptyName_Title=Empty persona name",})
|
||||
"PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty.",
|
||||
"PersonaDetailsPanel_EmptyName_Title=Empty persona name",
|
||||
"PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty.",
|
||||
"PersonaDetailsPanel_EmptyComment_Title=Empty persona comment",})
|
||||
Persona okHandler() {
|
||||
if (accountsToAdd.size() + currentAccounts.size() < 1) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
@ -721,6 +891,13 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
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()) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaDetailsPanel_EmptyName_msg(),
|
||||
@ -735,7 +912,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
try {
|
||||
PAccount firstAccount = accountsToAdd.get(0);
|
||||
ret = Persona.createPersonaForAccount(nameField.getText(),
|
||||
"", Persona.PersonaStatus.ACTIVE, firstAccount.account,
|
||||
commentField.getText(), Persona.PersonaStatus.ACTIVE, firstAccount.account,
|
||||
firstAccount.justification, firstAccount.confidence);
|
||||
for (int i = 1; i < accountsToAdd.size(); i++) {
|
||||
ret.addAccount(accountsToAdd.get(i).account,
|
||||
@ -760,6 +937,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
case EDIT:
|
||||
try {
|
||||
ret = currentPersona;
|
||||
currentPersona.setComment(commentField.getText());
|
||||
currentPersona.setName(nameField.getText());
|
||||
for (PAccount acc : accountsToAdd) {
|
||||
ret.addAccount(acc.account, acc.justification, acc.confidence);
|
||||
@ -767,18 +945,27 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
for (PersonaAccount acc : accountsToRemove) {
|
||||
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) {
|
||||
ret.addMetadata(md.name, md.value, md.justification, md.confidence);
|
||||
}
|
||||
for (PersonaMetadata md : metadataToRemove) {
|
||||
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) {
|
||||
ret.addAlias(pa.alias, pa.justification, pa.confidence);
|
||||
}
|
||||
for (PersonaAlias pa : aliasesToRemove) {
|
||||
ret.removeAlias(pa);
|
||||
}
|
||||
for (HashMap.Entry<PersonaAlias, PAlias> entry : aliasesToEdit.entrySet()) {
|
||||
ret.modifyAlias(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
|
||||
}
|
||||
} catch (CentralRepoException e) {
|
||||
logger.log(Level.SEVERE, "Failed to access central repository", e);
|
||||
JOptionPane.showMessageDialog(this,
|
||||
@ -795,14 +982,14 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the persona name field.
|
||||
*
|
||||
*
|
||||
* @param name Persona name.
|
||||
*/
|
||||
public void setPersonaName(String name) {
|
||||
nameField.setText(name);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
|
||||
|
||||
@Messages({
|
||||
"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() {
|
||||
Collection<Persona> results;
|
||||
try {
|
||||
|
@ -19,8 +19,8 @@
|
||||
package org.sleuthkit.autopsy.centralrepository.persona;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
||||
@ -35,20 +35,41 @@ public class PersonaMetadataDialog extends JDialog {
|
||||
|
||||
private final PersonaDetailsPanel pdp;
|
||||
|
||||
private PersonaDetailsPanel.PMetadata currentMetadata;
|
||||
|
||||
/**
|
||||
* Creates new add metadata dialog
|
||||
*/
|
||||
@Messages({"AddMetadataDialog.title.text=Add Metadata",})
|
||||
public PersonaMetadataDialog(PersonaDetailsPanel pdp) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||
super(SwingUtilities.windowForComponent(pdp),
|
||||
Bundle.AddMetadataDialog_title_text(),
|
||||
true);
|
||||
ModalityType.APPLICATION_MODAL);
|
||||
this.pdp = pdp;
|
||||
|
||||
initComponents();
|
||||
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.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
@ -191,8 +212,17 @@ public class PersonaMetadataDialog extends JDialog {
|
||||
|
||||
@Messages({
|
||||
"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
|
||||
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()) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.PersonaDetailsPanel_empty_justification_msg(),
|
||||
@ -200,17 +230,23 @@ public class PersonaMetadataDialog extends JDialog {
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
if (pdp.addMetadata(
|
||||
nameTextField.getText(),
|
||||
valueTextField.getText(),
|
||||
justificationTextField.getText(),
|
||||
(Persona.Confidence) confidenceComboBox.getSelectedItem())) {
|
||||
|
||||
Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem();
|
||||
String justification = justificationTextField.getText();
|
||||
|
||||
if (currentMetadata != null) {
|
||||
currentMetadata.confidence = confidence;
|
||||
currentMetadata.justification = justification;
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
if (pdp.addMetadata(nameTextField.getText(), valueTextField.getText(), justification, confidence)) {
|
||||
dispose();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.AddMetadataDialog_dup_msg(),
|
||||
Bundle.AddMetadataDialog_dup_Title(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_okBtnActionPerformed
|
||||
|
||||
|
@ -976,7 +976,7 @@ MessageArtifactViewer.rtfbodyScrollPane.TabConstraints.tabTitle=RTF
|
||||
MessageArtifactViewer.toText.text=to list goes here
|
||||
MessageArtifactViewer.toLabel.text=To:
|
||||
MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML
|
||||
CallLogArtifactViewer.localAccountPersonaLabel.text=Persona:
|
||||
CallLogArtifactViewer.localAccountPersonaLabel.text=Persona
|
||||
CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1
|
||||
CallLogArtifactViewer.localAccountPersonaButton.text=jButton1
|
||||
ContactArtifactViewer.personasLabel.text=Personas
|
||||
|
@ -37,11 +37,18 @@ ApplicationContentViewer.title=Application
|
||||
ApplicationContentViewer.toolTip=Displays file contents.
|
||||
CallLogArtifactViewer_number_from=From
|
||||
CallLogArtifactViewer_number_to=To
|
||||
CallLogArtifactViewer_persona_button_new=New
|
||||
CallLogArtifactViewer_persona_button_new=Create
|
||||
CallLogArtifactViewer_persona_button_view=View
|
||||
CallLogArtifactViewer_persona_label=\ Persona:
|
||||
CallLogArtifactViewer_persona_searching=\ Searching...
|
||||
CallLogArtifactViewer_persona_text_none=No Persona
|
||||
CallLogArtifactViewer_persona_label=\ Persona
|
||||
CallLogArtifactViewer_persona_searching=Searching...
|
||||
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.failedToGetSourcePath.message=Failed to get source file path from case database
|
||||
DefaultArtifactContentViewer.attrsTableHeader.sources=Source(s)
|
||||
@ -1080,3 +1087,4 @@ MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML
|
||||
CallLogArtifactViewer.localAccountPersonaLabel.text=Persona:
|
||||
CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1
|
||||
CallLogArtifactViewer.localAccountPersonaButton.text=jButton1
|
||||
ContactArtifactViewer.personasLabel.text=Personas
|
||||
|
@ -42,6 +42,7 @@ import javax.swing.SwingWorker;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
|
||||
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.PersonaAccount;
|
||||
import org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsDialog;
|
||||
@ -424,12 +425,17 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac
|
||||
* @throws CentralRepoException
|
||||
*/
|
||||
@NbBundle.Messages({
|
||||
"ContactArtifactViewer_persona_searching= Searching..."
|
||||
"ContactArtifactViewer_persona_searching= Searching...",
|
||||
"ContactArtifactViewer_persona_unknown=Unknown"
|
||||
})
|
||||
private void initiatePersonasSearch(List<BlackboardAttribute> accountAttributesList) throws CentralRepoException {
|
||||
|
||||
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
|
||||
GridBagLayout gridBagLayout = new GridBagLayout();
|
||||
GridBagConstraints constraints = new GridBagConstraints();
|
||||
@ -451,19 +457,27 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac
|
||||
personasPanel.add(personaLabel);
|
||||
|
||||
constraints.gridy++;
|
||||
javax.swing.JLabel primaryPersonaNameLabel = new javax.swing.JLabel();
|
||||
primaryPersonaNameLabel.setText(Bundle.ContactArtifactViewer_persona_searching());
|
||||
gridBagLayout.setConstraints(primaryPersonaNameLabel, constraints);
|
||||
personasPanel.add(primaryPersonaNameLabel);
|
||||
javax.swing.JLabel personaStatusLabel = new javax.swing.JLabel();
|
||||
personaStatusLabel.setText(personaStatusLabelText);
|
||||
gridBagLayout.setConstraints(personaStatusLabel, constraints);
|
||||
personasPanel.add(personaStatusLabel);
|
||||
|
||||
|
||||
if (CentralRepository.isEnabled() ) {
|
||||
personasLabel.setEnabled(true);
|
||||
|
||||
// Kick off a background task to serach for personas for the contact
|
||||
ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList);
|
||||
personaSearchTask.execute();
|
||||
} else {
|
||||
personasLabel.setEnabled(false);
|
||||
personaLabel.setEnabled(false);
|
||||
personaStatusLabel.setEnabled(false);
|
||||
}
|
||||
|
||||
personasPanel.setLayout(gridBagLayout);
|
||||
personasPanel.revalidate();
|
||||
personasPanel.repaint();
|
||||
|
||||
// Kick off a background task to serach for personas for the contact
|
||||
ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList);
|
||||
personaSearchTask.execute();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3,7 +3,13 @@ Installer.closing.confirmationDialog.title=Ingest is Running
|
||||
# {0} - exception message
|
||||
Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0}
|
||||
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-Short-Description=Autopsy Core Module
|
||||
org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml
|
||||
|
@ -19,12 +19,16 @@
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.Window;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
@ -32,10 +36,10 @@ import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import org.netbeans.core.actions.HTMLViewAction;
|
||||
import org.openide.awt.HtmlBrowser;
|
||||
import org.openide.modules.Places;
|
||||
import org.openide.util.ImageUtilities;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.Version;
|
||||
import org.sleuthkit.datamodel.SleuthkitJNI;
|
||||
@ -47,6 +51,7 @@ import org.sleuthkit.datamodel.SleuthkitJNI;
|
||||
public final class AboutWindowPanel extends JPanel implements HyperlinkListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger logger = Logger.getLogger(AboutWindowPanel.class.getName());
|
||||
private URL url = null;
|
||||
private final Icon about;
|
||||
private boolean verboseLogging;
|
||||
@ -67,12 +72,32 @@ public final class AboutWindowPanel extends JPanel implements HyperlinkListener
|
||||
description.setText(org.openide.util.NbBundle.getMessage(AboutWindowPanel.class,
|
||||
"LBL_Description", new Object[]{getProductVersionValue(), getJavaValue(), getVMValue(),
|
||||
getOperatingSystemValue(), getEncodingValue(), getSystemLocaleValue(), getUserDirValue(), getSleuthKitVersionValue(), Version.getNetbeansBuild(), Version.getBuildType().toString()}));
|
||||
description.addHyperlinkListener(this);
|
||||
copyright.addHyperlinkListener(this);
|
||||
copyright.setBackground(getBackground());
|
||||
if (verboseLoggingIsSet()) {
|
||||
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
|
||||
@ -212,7 +237,14 @@ private void logoLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:e
|
||||
if (url != null) {
|
||||
org.openide.awt.StatusDisplayer.getDefault().setStatusText(
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@ DataContentViewerHex.pageLabel2.text=Page
|
||||
# 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>
|
||||
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™ is a digital forensics platform based on The Sleuth Kit™ 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 © 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™ is a digital forensics platform based on The Sleuth Kit™ 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 © 2003-2020. </div>
|
||||
URL_ON_IMG=http://www.sleuthkit.org/
|
||||
FILE_FOR_LOCAL_HELP=file:///
|
||||
INDEX_FOR_LOCAL_HELP=/docs/index.html
|
||||
|
@ -17,9 +17,6 @@ CTL_DataContentTopComponent=Data Content
|
||||
CTL_CustomAboutAction=About
|
||||
CTL_OfflineHelpAction=Offline 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.failedToGetSourcePath.message=Failed to get source file path from case database
|
||||
DataContentViewerHex.copyingFile=Copying file to open in HxD...
|
||||
@ -63,9 +60,9 @@ DataContentViewerHex.totalPageLabel.text_1=100
|
||||
DataContentViewerHex.pageLabel2.text=Page
|
||||
|
||||
# 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}
|
||||
LBL_Copyright=<div style="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy™ is a digital forensics platform based on The Sleuth Kit™ 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 © 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™ is a digital forensics platform based on The Sleuth Kit™ 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 © 2003-2020. </div>
|
||||
SortChooser.dialogTitle=Choose Sort Criteria
|
||||
ThumbnailViewChildren.progress.cancelling=(Cancelling)
|
||||
# {0} - file name
|
||||
@ -82,8 +79,6 @@ DataContentViewerArtifact.pageLabel2.text=Result
|
||||
DataContentViewerArtifact.nextPageButton.text=
|
||||
DataContentViewerArtifact.currentPageLabel.text=1
|
||||
DataContentViewerArtifact.ofLabel.text=of
|
||||
DataContentViewerArtifact.copyMenuItem.text=Copy
|
||||
DataContentViewerArtifact.selectAllMenuItem.text=Select All
|
||||
DataContentViewerArtifact.pageLabel.text=Result:
|
||||
AdvancedConfigurationDialog.applyButton.text=OK
|
||||
DataContentViewerHex.goToPageTextField.text=
|
||||
@ -95,7 +90,7 @@ DataResultViewerThumbnail.pageNextButton.text=
|
||||
DataResultViewerThumbnail.imagesLabel.text=Images:
|
||||
DataResultViewerThumbnail.imagesRangeLabel.text=-
|
||||
DataResultViewerThumbnail.pageNumLabel.text=-
|
||||
DataResultViewerThumbnail.filePathLabel.text=\
|
||||
DataResultViewerThumbnail.filePathLabel.text=\ \ \
|
||||
DataResultViewerThumbnail.goToPageLabel.text=Go to Page:
|
||||
DataResultViewerThumbnail.goToPageField.text=
|
||||
AdvancedConfigurationDialog.cancelButton.text=Cancel
|
||||
@ -129,9 +124,9 @@ DataResultViewerThumbnail.switchPage.done.errMsg=Error making thumbnails: {0}
|
||||
AboutWindowPanel.actVerboseLogging.text=Activate verbose logging
|
||||
OptionsCategory_Name_Multi_User_Settings=Multi-User
|
||||
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.lbDatabaseSettings.text=Database Settings
|
||||
MultiUserSettingsPanel.lbDatabaseSettings.text=Database Server Settings
|
||||
MultiUserSettingsPanel.validationErrMsg.incomplete=Fill in all values
|
||||
MultiUserSettingsPanel.nonWindowsOs.msg=Multi-user cases are only available on Windows platforms
|
||||
MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=Invalid database port number
|
||||
@ -159,7 +154,7 @@ MultiUserSettingsPanel.tbSolrHostname.toolTipText=Hostname or IP Address
|
||||
MultiUserSettingsPanel.tbSolrPort.toolTipText=Port Number
|
||||
MultiUserSettingsPanel.lbTestMessageService.text=
|
||||
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.text=
|
||||
MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name (optional)
|
||||
|
@ -65,7 +65,7 @@ DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8
|
||||
# \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>
|
||||
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™ \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 © 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™ \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 © 2003-2020.</div>
|
||||
SortChooser.dialogTitle=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u9078\u629e
|
||||
ThumbnailViewChildren.progress.cancelling=(\u53d6\u308a\u6d88\u3057\u4e2d)
|
||||
# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
|
||||
|
@ -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.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1}
|
||||
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
|
||||
ReadImageTask.mesageText=Reading image: {0}
|
||||
StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract
|
||||
|
@ -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.comment.name=\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.fileChangedTime.name=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642
|
||||
ContentTagNode.createSheet.fileChangedTime.displayName=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642
|
||||
|
@ -38,8 +38,6 @@ HINT_DirectoryTreeTopComponent=This is a DirectoryTree window
|
||||
OpenIDE-Module-Name=DirectoryTree
|
||||
FileSystemDetailsPanel.imgOffsetLabel.text=Image Offset:
|
||||
FileSystemDetailsPanel.fsTypeLabel.text=FileSystem Type:
|
||||
FileSystemDetailsPanel.jLabel2.text=bytes
|
||||
FileSystemDetailsPanel.jLabel3.text=bytes
|
||||
FileSystemDetailsPanel.fsTypeValue.text=...
|
||||
FileSystemDetailsPanel.imgOffsetValue.text=...
|
||||
FileSystemDetailsPanel.volumeIDValue.text=...
|
||||
@ -71,7 +69,6 @@ VolumeDetailsPanel.startLabel.text=Starting Sector:
|
||||
VolumeDetailsPanel.lengthLabel.text=Length in Sectors:
|
||||
VolumeDetailsPanel.descLabel.text=Description:
|
||||
VolumeDetailsPanel.flagsLabel.text=Flags:
|
||||
VolumeDetailsPanel.jLabel1.text=General Volume Information
|
||||
VolumeDetailsPanel.OKButton.text=OK
|
||||
ImageDetailsPanel.imageInfoLabel.text=Image Information
|
||||
ImageDetailsPanel.imgNameLabel.text=Name:
|
||||
@ -160,3 +157,6 @@ ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
|
||||
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
|
||||
ExternalViewerGlobalSettingsPanel.HxDLabel.text=HxD Editor Path:
|
||||
ExternalViewerGlobalSettingsPanel.ContentViewerExtensionLabel.text=Add content viewer extensions:
|
||||
FileSystemDetailsPanel.bytesLabel1.text=bytes
|
||||
FileSystemDetailsPanel.bytesLabel2.text=bytes
|
||||
VolumeDetailsPanel.generalVolumeLabel.text=General Volume Information
|
||||
|
@ -14,11 +14,9 @@ KnownStatusSearchPanel.knownCheckBox.text=Known Status:
|
||||
KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable
|
||||
KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other)
|
||||
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.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.accessedCheckBox.text=Accessed
|
||||
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.validationErr.msg=Validation Error: {0}
|
||||
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.
|
||||
SizeSearchPanel.sizeCompareComboBox.equalTo=equal to
|
||||
SizeSearchPanel.sizeCompareComboBox.greaterThan=greater than
|
||||
SizeSearchPanel.sizeCompareComboBox.lessThan=less than
|
||||
MimeTypePanel.jLabel1.text=*Note: Multiple MIME types can be selected
|
||||
FileSearchPanel.searchButton.text=Search
|
||||
MimeTypePanel.mimeTypeCheckBox.text=MIME Type:
|
||||
HashSearchPanel.md5CheckBox.text=MD5:
|
||||
@ -72,3 +69,6 @@ DataSourcePanel.dataSourceCheckBox.label=Data Source:
|
||||
DataSourcePanel.dataSourceCheckBox.actionCommand=Data Source:
|
||||
DataSourcePanel.dataSourceCheckBox.text=Data Source:
|
||||
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
|
||||
|
@ -81,6 +81,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
/**
|
||||
* The map panel. This panel contains the jxmapviewer MapViewer
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
final public class MapPanel extends javax.swing.JPanel {
|
||||
|
||||
static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION";
|
||||
@ -399,7 +400,7 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
* Show the popup menu for the given waypoint and location.
|
||||
*
|
||||
* @param waypoint Selected waypoint
|
||||
* @param point Current mouse click location
|
||||
* @param point Current mouse click location
|
||||
*/
|
||||
private void showPopupMenu(MapWaypoint waypoint, Point point) throws TskCoreException {
|
||||
if (waypoint == null) {
|
||||
@ -478,7 +479,7 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
* @param clickPoint The mouse click point
|
||||
*
|
||||
* @return A waypoint that is within 10 pixels of the given point, or null
|
||||
* if none was found.
|
||||
* if none was found.
|
||||
*/
|
||||
private List<MapWaypoint> findClosestWaypoint(Point clickPoint) {
|
||||
if (waypointTree == null) {
|
||||
@ -759,6 +760,7 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
/**
|
||||
*
|
||||
* @param waypoint the waypoint for which to get the color selected
|
||||
*
|
||||
* @return the color that this waypoint should be rendered
|
||||
*/
|
||||
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
|
||||
*
|
||||
* @param color the color of the new image
|
||||
*
|
||||
* @return the new dot image
|
||||
*/
|
||||
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
|
||||
*
|
||||
* @param color the color of the new image
|
||||
*
|
||||
* @return the new waypoint image
|
||||
*/
|
||||
private BufferedImage createWaypointImage(Color color) {
|
||||
|
@ -62,6 +62,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* Waypoint interface.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewer.Waypoint {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MapWaypoint.class.getName());
|
||||
|
@ -140,7 +140,7 @@ IngestJob.cancelReason.outOfDiskSpace.text=Out of disk space
|
||||
IngestJob.cancelReason.servicesDown.text=Services Down
|
||||
IngestJob.cancelReason.caseClosed.text=Case closed
|
||||
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
||||
gest=
|
||||
gest
|
||||
IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced
|
||||
IngestJobSettingsPanel.globalSettingsButton.text=Global Settings
|
||||
IngestJobSettingsPanel.pastJobsButton.text=History
|
||||
|
@ -29,6 +29,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
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 org.netbeans.api.progress.ProgressHandle;
|
||||
import org.openide.util.Cancellable;
|
||||
@ -58,8 +61,13 @@ import org.sleuthkit.autopsy.python.FactoryClassNameNormalizer;
|
||||
*/
|
||||
public final class DataSourceIngestJob {
|
||||
|
||||
private static String AUTOPSY_MODULE_PREFIX = "org.sleuthkit.autopsy";
|
||||
|
||||
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
|
||||
* ID, the user's ingest job settings, and the data source to be analyzed.
|
||||
@ -216,6 +224,74 @@ public final class DataSourceIngestJob {
|
||||
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.
|
||||
*/
|
||||
@ -227,12 +303,18 @@ public final class DataSourceIngestJob {
|
||||
*/
|
||||
Map<String, IngestModuleTemplate> dataSourceModuleTemplates = 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) {
|
||||
if (template.isDataSourceIngestModuleTemplate()) {
|
||||
dataSourceModuleTemplates.put(template.getModuleFactory().getClass().getCanonicalName(), template);
|
||||
addModule(dataSourceModuleTemplates, jythonDataSourceModuleTemplates, template);
|
||||
}
|
||||
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.
|
||||
*/
|
||||
IngestPipelinesConfiguration pipelineConfigs = IngestPipelinesConfiguration.getInstance();
|
||||
List<IngestModuleTemplate> firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig());
|
||||
List<IngestModuleTemplate> fileIngestModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(fileModuleTemplates, pipelineConfigs.getFileIngestPipelineConfig());
|
||||
List<IngestModuleTemplate> secondStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageTwoDataSourceIngestPipelineConfig());
|
||||
List<IngestModuleTemplate> firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(
|
||||
dataSourceModuleTemplates, jythonDataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig());
|
||||
|
||||
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
|
||||
* configuration to an appropriate pipeline - either the first stage
|
||||
* data source ingest pipeline or the file ingest pipeline.
|
||||
*/
|
||||
for (IngestModuleTemplate template : dataSourceModuleTemplates.values()) {
|
||||
firstStageDataSourceModuleTemplates.add(template);
|
||||
}
|
||||
for (IngestModuleTemplate template : fileModuleTemplates.values()) {
|
||||
fileIngestModuleTemplates.add(template);
|
||||
}
|
||||
addOrdered(firstStageDataSourceModuleTemplates, dataSourceModuleTemplates, jythonDataSourceModuleTemplates);
|
||||
addOrdered(fileIngestModuleTemplates, fileModuleTemplates, jythonFileModuleTemplates);
|
||||
|
||||
/**
|
||||
* 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
|
||||
* collection as they are added to the output collection.
|
||||
*
|
||||
* @param ingestModuleTemplates A mapping of ingest module factory class
|
||||
* names to ingest module templates.
|
||||
* @param pipelineConfig An ordered list of ingest module factory
|
||||
* class names representing an ingest pipeline.
|
||||
* @param ingestModuleTemplates A mapping of ingest module factory
|
||||
* class names to ingest module
|
||||
* templates.
|
||||
* @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
|
||||
* 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<>();
|
||||
for (String moduleClassName : pipelineConfig) {
|
||||
if (ingestModuleTemplates.containsKey(moduleClassName)) {
|
||||
if (ingestModuleTemplates != null && ingestModuleTemplates.containsKey(moduleClassName)) {
|
||||
templates.add(ingestModuleTemplates.remove(moduleClassName));
|
||||
} else if (jythonIngestModuleTemplates != null && jythonIngestModuleTemplates.containsKey(moduleClassName)) {
|
||||
templates.add(jythonIngestModuleTemplates.remove(moduleClassName));
|
||||
}
|
||||
}
|
||||
return templates;
|
||||
|
@ -937,7 +937,7 @@ class IngestMessagePanel extends JPanel implements TableModelListener {
|
||||
Object aValue = value;
|
||||
if (value instanceof Date) {
|
||||
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);
|
||||
} else {
|
||||
throw new RuntimeException(NbBundle.getMessage(this.getClass(),
|
||||
|
@ -221,7 +221,7 @@ class IngestProgressSnapshotPanel extends javax.swing.JPanel {
|
||||
cellValue = snapShot.getDataSource();
|
||||
break;
|
||||
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()));
|
||||
break;
|
||||
case 3:
|
||||
|
@ -4,7 +4,7 @@ Contains only the core ingest modules that ship with Autopsy -->
|
||||
<PIPELINE_CONFIG>
|
||||
<PIPELINE type="ImageAnalysisStageOne">
|
||||
<MODULE>org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory</MODULE>
|
||||
<MODULE>org.sleuthkit.autopsy.modules.android.AndroidModuleFactory</MODULE>
|
||||
<MODULE>module.AndroidModuleFactory</MODULE>
|
||||
</PIPELINE>
|
||||
|
||||
<PIPELINE type="FileAnalysis">
|
||||
@ -16,9 +16,10 @@ Contains only the core ingest modules that ship with Autopsy -->
|
||||
<MODULE>org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory</MODULE>
|
||||
<MODULE>org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory</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 type="ImageAnalysisStageTwo">
|
||||
<MODULE>org.sleuthkit.autopsy.modules.dataSourceIntegrity.DataSourceIntegrityModuleFactory</MODULE>
|
||||
</PIPELINE>
|
||||
|
@ -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.toolTipText=Disks were not detected.
|
||||
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.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.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
|
||||
|
@ -45,6 +45,6 @@ DataSourceIntegrityIngestModule.shutDown.resultLi=<li>Result:{0} </li>
|
||||
DataSourceIntegrityIngestModule.shutDown.calcHashLi=<li>Calculated hash: {0} </li>
|
||||
DataSourceIntegrityIngestModule.shutDown.storedHashLi=<li>Stored hash: {0} </li>
|
||||
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.ingestSettingsLabel.text=Ingest Settings
|
||||
DataSourceIntegrityIngestSettingsPanel.noteLabel.text=Note that this module will not run on logical files
|
||||
|
@ -11,7 +11,12 @@ ExtractArchiveWithPasswordAction.progress.text=Unpacking contents of archive: {0
|
||||
ExtractArchiveWithPasswordAction.prompt.text=Enter Password
|
||||
ExtractArchiveWithPasswordAction.prompt.title=Enter Password
|
||||
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-Short-Description=Embedded File Extraction Ingest Module
|
||||
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.unpack.warnMsg.zipBomb=Possible ZIP bomb detected: {0}
|
||||
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=The archive is {0} levels deep, skipping processing of {1}
|
||||
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=Unknown item path in archive: {0}, will use: {1}
|
||||
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=Not enough disk space to unpack archive item: {0}, {1}
|
||||
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=The archive item is too large to unpack, skipping unpacking this item.
|
||||
EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg=Error unpacking {0}
|
||||
|
@ -2,7 +2,9 @@ CannotRunFileTypeDetection=Cannot run file type detection.
|
||||
ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s).
|
||||
ExifParserFileIngestModule.userContent.description=EXIF metadata exists for this file.
|
||||
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-Short-Description=Exif metadata ingest module
|
||||
ExifParserFileIngestModule.moduleName.text=Exif Parser
|
||||
|
@ -36,27 +36,27 @@ FileExtMismatchSettingsPanel.jLabel1.text=File Types:
|
||||
FileExtMismatchSettingsPanel.newExtButton.text=New Extension
|
||||
FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type:
|
||||
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.mimeTypeNotSupported.message=MIME type not supported!
|
||||
FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME 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.mimeTypeNotDetectable.message=MIME type is not detectable by this module.
|
||||
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.newExtPrompt.message=Add an 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.noMimeType.message=No MIME type selected!
|
||||
FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=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.removeExtButton.noneSelected.message=No extension selected!
|
||||
FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=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.removeTypeButton.toolTipText=
|
||||
FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types
|
||||
|
@ -51,7 +51,6 @@ FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=Load Failed
|
||||
FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=Failed to load existing file type definitions.
|
||||
FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=Failed to save file type definitions.
|
||||
FileTypeIdGlobalSettingsPanel.newTypeButton.text=New Type
|
||||
FileTypeIdGlobalSettingsPanel.jLabel2.text=Custom MIME Types:
|
||||
FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector.
|
||||
AddFileTypeSignaturePanel.offsetLabel.text=Byte Offset
|
||||
AddFileTypeSignaturePanel.signatureTextField.text=
|
||||
@ -60,7 +59,6 @@ AddFileTypeSignaturePanel.signatureLabel.text=Signature
|
||||
AddFileTypeSignaturePanel.hexPrefixLabel.text=0x
|
||||
AddFileTypeSignaturePanel.offsetRelativeToLabel.text=Offset is relative to
|
||||
AddFileTypeSignaturePanel.offsetTextField.text=
|
||||
FileTypeIdGlobalSettingsPanel.jLabel1.text=Signatures
|
||||
FileTypeIdGlobalSettingsPanel.editTypeButton.text=Edit Type
|
||||
AddFileTypePanel.mimeTypeTextField.text=
|
||||
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.setNameTextField.text=
|
||||
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
|
||||
|
@ -83,8 +83,8 @@ FilesSetRulePanel.nameTextField.text=
|
||||
FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional):
|
||||
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.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.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.invalidPathRegex=The path regular expression is not valid:\n\n{0}
|
||||
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
|
||||
@ -109,21 +109,14 @@ FilesSetDefsPanel.ingest.deleteSetButton.text=Delete Filter
|
||||
FilesSetDefsPanel.interesting.jLabel6.text=Set Details
|
||||
FilesSetDefsPanel.ingest.jLabel6.text=Filter Details
|
||||
FilesSetDefsPanel.newRuleButton.text=New Rule
|
||||
FilesSetDefsPanel.jLabel8.text=File Size:
|
||||
FilesSetDefsPanel.jLabel7.text=MIME Type:
|
||||
FilesSetDefsPanel.rulePathConditionRegexCheckBox.text=Regex
|
||||
FilesSetDefsPanel.jLabel4.text=Path Substring:
|
||||
FilesSetDefsPanel.jLabel1.text=Rule Details
|
||||
FilesSetDefsPanel.dirsRadioButton.text=Directories
|
||||
FilesSetDefsPanel.jLabel2.text=File Type:
|
||||
FilesSetDefsPanel.deleteRuleButton.text=Delete Rule
|
||||
FilesSetDefsPanel.fileNameRegexCheckbox.text=Substring / Regex
|
||||
FilesSetDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files
|
||||
FilesSetDefsPanel.rulePathConditionTextField.text=
|
||||
FilesSetDefsPanel.fileNameRadioButton.text=Full Name
|
||||
FilesSetDefsPanel.jLabel5.text=Description:
|
||||
FilesSetDefsPanel.fileNameTextField.text=
|
||||
FilesSetDefsPanel.jLabel3.text=Name:
|
||||
FilesSetDefsPanel.fileNameExtensionRadioButton.text=Extension Only
|
||||
FilesSetDefsPanel.rulesListLabel.text=Rules:
|
||||
FilesSetDefsPanel.editRuleButton.text=Edit Rule
|
||||
@ -140,3 +133,10 @@ FilesSetDefsPanel.modifiedDateLabel.text=Modified Within:
|
||||
FilesSetDefsPanel.daysIncludedTextField.text=
|
||||
FilesSetDefsPanel.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:
|
||||
|
@ -21,7 +21,7 @@ PhotoRecIngestModule.complete.totalParsetime=Total Parsing Time:
|
||||
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.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.complete.numberOfErrors=Number of Errors while Carving:
|
||||
PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings
|
||||
|
@ -5,8 +5,8 @@ ReportHTML.getName.text=HTML Report
|
||||
ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
|
||||
ReportHTML.writeIndex.title=for case {0}
|
||||
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.seeSum=and <a href="contentsummary.html">the summary page</a> for a case summary.
|
||||
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href\="content\nav.html">the navigation page</a> for artifact links,
|
||||
ReportHTML.writeIndex.seeSum=and <a href\="content\summary.html">the summary page</a> for a case summary.
|
||||
ReportHTML.writeNav.title=Report Navigation
|
||||
ReportHTML.writeNav.h1=Report Navigation
|
||||
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.examiner=Examiner:
|
||||
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,
|
||||
# examiner as a regex signature to skip report.html and summary.html
|
||||
|
@ -19,3 +19,4 @@ TranslationContentPanel.ocrLabel.text=OCR:
|
||||
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.
|
||||
TranslationContentPanel.showLabel.text=Show:
|
||||
TranslationContentPanel.jSepLarge1.AccessibleContext.accessibleName=
|
||||
|
@ -89,6 +89,10 @@ AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the c
|
||||
AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled
|
||||
AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist
|
||||
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.Down=down
|
||||
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.deletingCaseDirCoordSvcNode=Deleting case directory znode...
|
||||
DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode...
|
||||
# {0} - data source path
|
||||
DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}...
|
||||
DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode...
|
||||
# {0} - manifest file path
|
||||
DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}...
|
||||
# {0} - manifest file path
|
||||
DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}...
|
||||
DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode...
|
||||
DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths...
|
||||
# {0} - manifest file path
|
||||
DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}...
|
||||
DeleteCaseTask.progress.openingCaseDatabase=Opening the case database...
|
||||
DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file...
|
||||
# {0} - manifest file path
|
||||
DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}...
|
||||
# {0} - manifest file path
|
||||
DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}...
|
||||
DeleteCaseTask.progress.startMessage=Starting deletion...
|
||||
DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes
|
||||
@ -207,6 +217,7 @@ DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orph
|
||||
DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup
|
||||
DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes
|
||||
DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service
|
||||
# {0} - node path
|
||||
DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0}
|
||||
DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for 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.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details.
|
||||
OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File
|
||||
# {0} - caseErrorMessage
|
||||
OpenCaseAction.errorMsg=Failed to open case: {0}
|
||||
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.
|
||||
|
@ -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.unableToCreateCase=Unable to create case
|
||||
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.unableToReadTestFileFromDatabase=Unable to read test file info from case database
|
||||
MultiUserTestTool.unableToRunIngest=Unable to run ingest on test data source
|
||||
|
@ -36,7 +36,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found
|
||||
KeywordSearchResultFactory.query.exception.msg=Could not perform the query
|
||||
OpenIDE-Module-Display-Category=Ingest Module
|
||||
|
||||
OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
|
||||
OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
|
||||
OpenIDE-Module-Name=KeywordSearch
|
||||
OptionsCategory_Name_KeywordSearchOptions=Keyword Search
|
||||
OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search
|
||||
@ -360,24 +360,24 @@ DropdownListSearchPanel.jSaveSearchResults.text=Save search results
|
||||
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.
|
||||
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.hitButtonsLabel.text=Match
|
||||
ExtractedContentPanel.hitTotalLabel.text=-
|
||||
ExtractedContentPanel.hitOfLabel.text=of
|
||||
ExtractedContentPanel.hitNextButton.text=
|
||||
ExtractedContentPanel.hitButtonsLabel.text=Match
|
||||
ExtractedContentPanel.hitCountLabel.text=-
|
||||
ExtractedContentPanel.hitLabel.toolTipText=
|
||||
ExtractedContentPanel.hitLabel.text=Matches on page:
|
||||
ExtractedContentPanel.pageCurLabel.text=-
|
||||
ExtractedContentPanel.pageNextButton.text=
|
||||
ExtractedContentPanel.pagePreviousButton.actionCommand=pagePreviousButton
|
||||
ExtractedContentPanel.pagePreviousButton.text=
|
||||
ExtractedContentPanel.pageNextButton.text=
|
||||
ExtractedContentPanel.pagesLabel.text=Page:
|
||||
ExtractedContentPanel.pageTotalLabel.text=-
|
||||
ExtractedContentPanel.pageButtonsLabel.text=Page
|
||||
ExtractedContentPanel.pageTotalLabel.text=-
|
||||
ExtractedContentPanel.pageOfLabel.text=of
|
||||
ExtractedContentPanel.jLabel1.text=Text Source:
|
||||
ExtractedContentPanel.AccessibleContext.accessibleName=
|
||||
ExtractedContentPanel.pageCurLabel.text=-
|
||||
ExtractedContentPanel.pagesLabel.text=Page:
|
||||
TextZoomPanel.zoomInButton.text=
|
||||
TextZoomPanel.zoomOutButton.text=
|
||||
TextZoomPanel.zoomResetButton.text=Reset
|
||||
|
@ -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_loading_files_msg=Chrome Cache: Loading files from %s.
|
||||
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}
|
||||
DataSourceUsage_AndroidMedia=Android Media Card
|
||||
DataSourceUsage_DJU_Drone_DAT=DJI Internal SD Card
|
||||
DataSourceUsage_FlashDrive=Flash Drive
|
||||
# {0} - OS name
|
||||
DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
|
||||
DataSourceUsageAnalyzer.parentModuleName=Recent Activity
|
||||
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_Trusted=Trusted Sites Zone
|
||||
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-Short-Description=Recent Activity finder ingest module
|
||||
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
|
||||
RegRipperFullNotFound=Full version RegRipper executable not found.
|
||||
RegRipperNotFound=Autopsy RegRipper executable not found.
|
||||
# {0} - file name
|
||||
SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
|
||||
SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
|
||||
SearchEngineURLQueryAnalyzer.engineName.none=NONE
|
||||
|
@ -418,10 +418,31 @@ class ExtractRegistry extends Extract {
|
||||
String errFilePath = outFilePathBase + "-full.err.txt"; //NON-NLS
|
||||
logger.log(Level.INFO, "Writing Full RegRipper results to: {0}", regOutputFiles.fullPlugins); //NON-NLS
|
||||
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;
|
||||
}
|
||||
|
||||
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) {
|
||||
try {
|
||||
List<String> commandLine = new ArrayList<>();
|
||||
@ -1497,11 +1518,11 @@ class ExtractRegistry extends Extract {
|
||||
line = line.trim();
|
||||
// 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
|
||||
while (!line.contains(SECTION_DIVIDER) && !line.contains("MSOffice version not found.")) {
|
||||
while (!line.contains(SECTION_DIVIDER)) {
|
||||
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
|
||||
// 1294283922|REG|||OfficeDocs2010 - F:\Windows_time_Rules_xp.doc
|
||||
String tokens[] = line.split("\\|");
|
||||
|
@ -1,5 +1,5 @@
|
||||
#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
|
||||
SPLASH_HEIGHT=314
|
||||
SPLASH_WIDTH=538
|
||||
@ -8,4 +8,4 @@ SplashRunningTextBounds=0,289,538,18
|
||||
SplashRunningTextColor=0x0
|
||||
SplashRunningTextFontSize=19
|
||||
|
||||
currentVersion=Autopsy 4.13.0
|
||||
currentVersion=Autopsy 4.15.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
#Updated by build script
|
||||
#Tue, 12 Nov 2019 17:21:46 -0500
|
||||
CTL_MainWindow_Title=Autopsy 4.13.0
|
||||
CTL_MainWindow_Title_No_Project=Autopsy 4.13.0
|
||||
#Fri, 12 Jun 2020 14:50:38 -0400
|
||||
CTL_MainWindow_Title=Autopsy 4.15.0
|
||||
CTL_MainWindow_Title_No_Project=Autopsy 4.15.0
|
||||
|
20
thirdparty/rr-full/plugins/eventlogs.pl
vendored
20
thirdparty/rr-full/plugins/eventlogs.pl
vendored
@ -57,9 +57,11 @@ sub pluginmain {
|
||||
::rptMsg($win_path);
|
||||
::rptMsg("LastWrite Time ".gmtime($win->get_timestamp())." (UTC)");
|
||||
my $cn;
|
||||
if ($cn = $win->get_value("ComputerName")->get_data()) {
|
||||
::rptMsg("ComputerName = ".$cn);
|
||||
}
|
||||
if (defined($win->get_value("ComputerName"))) {
|
||||
if ($cn = $win->get_value("ComputerName")->get_data()) {
|
||||
::rptMsg("ComputerName = ".$cn);
|
||||
}
|
||||
}
|
||||
else {
|
||||
::rptMsg("ComputerName value not found.");
|
||||
}
|
||||
@ -81,9 +83,15 @@ sub pluginmain {
|
||||
::rptMsg(" ".$evpath);
|
||||
::rptMsg(" LastWrite Time ".gmtime($evlog->get_timestamp())." (UTC)");
|
||||
::rptMsg(" Configuration Settings");
|
||||
::rptMsg(" Log location: ".$evlog->get_value('File')->get_data());
|
||||
::rptMsg(" Log Size: ".$evlog->get_value('MaxSize')->get_data()." Bytes");
|
||||
($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled")
|
||||
if (defined($evlog->get_value('File'))) {
|
||||
::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");
|
||||
}
|
||||
if (defined($evlog->get_value('AutoBackupLogFiles'))) {
|
||||
($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled")
|
||||
}
|
||||
}
|
||||
else {
|
||||
::rptMsg($logname->get_name()." Event Log not found.");
|
||||
|
70
thirdparty/rr-full/plugins/ie_zones.pl
vendored
70
thirdparty/rr-full/plugins/ie_zones.pl
vendored
@ -60,40 +60,48 @@ sub pluginmain {
|
||||
::rptMsg("");
|
||||
# Get Zones and various security settings
|
||||
foreach my $n (0..4) {
|
||||
$zone = $key->get_subkey('Zones\\'.$n);
|
||||
::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data());
|
||||
::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC"));
|
||||
|
||||
my @vals = $zone->get_list_of_values();
|
||||
if (scalar(@vals) > 0) {
|
||||
foreach my $v (@vals) {
|
||||
my $name = $v->get_name();
|
||||
next unless (length($name) == 4 && $name ne "Icon");
|
||||
my $data = $v->get_data();
|
||||
$name = "**".$name if ($name eq "1609" && $data == 0);
|
||||
my $str = sprintf "%6s 0x%08x",$name,$data;
|
||||
# ::rptMsg(" ".$name." ".$data." ".$zones{$data});
|
||||
::rptMsg($str." ".$zones{$data});
|
||||
}
|
||||
}
|
||||
::rptMsg("");
|
||||
if (defined($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());
|
||||
} else {
|
||||
::rptMsg("Zone ".$n.": ".$zone->get_value("DisplayName")->get_data()." - ".$zone->get_value("Description")->get_data());
|
||||
}
|
||||
::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC"));
|
||||
|
||||
my @vals = $zone->get_list_of_values();
|
||||
if (scalar(@vals) > 0) {
|
||||
foreach my $v (@vals) {
|
||||
my $name = $v->get_name();
|
||||
next unless (length($name) == 4 && $name ne "Icon");
|
||||
my $data = $v->get_data();
|
||||
$name = "**".$name if ($name eq "1609" && $data == 0);
|
||||
my $str = sprintf "%6s 0x%08x",$name,$data;
|
||||
# ::rptMsg(" ".$name." ".$data." ".$zones{$data});
|
||||
::rptMsg($str." ".$zones{$data});
|
||||
}
|
||||
}
|
||||
::rptMsg("");
|
||||
}
|
||||
}
|
||||
# Now, get ZoneMap settings
|
||||
my $zonemap = $key->get_subkey('ZoneMap\\Domains');
|
||||
my @domains = $zonemap->get_list_of_subkeys();
|
||||
if (scalar(@domains) > 0) {
|
||||
foreach my $d (@domains) {
|
||||
::rptMsg("Domain: ".$d->get_name());
|
||||
if (defined($key->get_subkey('ZoneMap\\Domains'))) {
|
||||
my $zonemap = $key->get_subkey('ZoneMap\\Domains');
|
||||
my @domains = $zonemap->get_list_of_subkeys();
|
||||
if (scalar(@domains) > 0) {
|
||||
foreach my $d (@domains) {
|
||||
::rptMsg("Domain: ".$d->get_name());
|
||||
|
||||
my @vals = $d->get_list_of_values();
|
||||
if (scalar(@vals) > 0) {
|
||||
foreach my $v (@vals) {
|
||||
::rptMsg(" ".$v->get_name()." ".$v->get_data());
|
||||
}
|
||||
}
|
||||
::rptMsg("");
|
||||
}
|
||||
}
|
||||
my @vals = $d->get_list_of_values();
|
||||
if (scalar(@vals) > 0) {
|
||||
foreach my $v (@vals) {
|
||||
::rptMsg(" ".$v->get_name()." ".$v->get_data());
|
||||
}
|
||||
}
|
||||
::rptMsg("");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# ::rptMsg($key_path." not found.");
|
||||
|
6
thirdparty/rr-full/plugins/searchscopes.pl
vendored
6
thirdparty/rr-full/plugins/searchscopes.pl
vendored
@ -47,8 +47,10 @@ sub pluginmain {
|
||||
if ($key = $root_key->get_subkey($key_path)) {
|
||||
::rptMsg("SearchScopes");
|
||||
::rptMsg($key_path);
|
||||
::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data());
|
||||
::rptMsg("");
|
||||
if (defined($key->get_value("DefaultScope"))) {
|
||||
::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data());
|
||||
::rptMsg("");
|
||||
}
|
||||
# ::rptMsg("LastWrite Time ".gmtime($key->get_timestamp())." (UTC)");
|
||||
my @subkeys = $key->get_list_of_subkeys();
|
||||
if (scalar(@subkeys) > 0) {
|
||||
|
5
thirdparty/rr-full/shellitems.pl
vendored
5
thirdparty/rr-full/shellitems.pl
vendored
@ -480,10 +480,11 @@ sub parseDeviceEntry {
|
||||
|
||||
# Version 3 = XP
|
||||
if ($ver == 3) {
|
||||
my $guid1 = parseGUID(substr($data,$ofs + 6,16));
|
||||
if (length($data) > ($ofs + 6)) {
|
||||
my $guid1 = parseGUID(substr($data,$ofs + 6,16));
|
||||
my $guid2 = parseGUID(substr($data,$ofs + 6 + 16,16));
|
||||
$item{name} = $guid1."\\".$guid2
|
||||
|
||||
}
|
||||
}
|
||||
# Version 8 = Win7
|
||||
elsif ($ver == 8) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user