6398 Persona deletion functionality

This commit is contained in:
Ethan Roseman 2020-06-04 10:03:40 -04:00
parent 4235e4f264
commit 827561fd7a
5 changed files with 63 additions and 9 deletions

View File

@ -293,6 +293,14 @@ public class Persona {
public void removeAccount(PersonaAccount account) throws CentralRepoException { public void removeAccount(PersonaAccount account) throws CentralRepoException {
PersonaAccount.removePersonaAccount(account.getId()); PersonaAccount.removePersonaAccount(account.getId());
} }
/**
* 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);
}
/** /**
* Callback to process a Persona query from the persona table. * Callback to process a Persona query from the persona table.
@ -364,7 +372,8 @@ public class Persona {
} }
/** /**
* Gets the rows from the Personas table with matching name. * Gets the rows from the Personas table with matching name.
* Persona marked as DELETED are not returned.
* *
* @param partialName Name substring to match. * @param partialName Name substring to match.
* @return Collection of personas matching the given name substring, may be * @return Collection of personas matching the given name substring, may be
@ -376,7 +385,8 @@ public class Persona {
public static Collection<Persona> getPersonaByName(String partialName) throws CentralRepoException { public static Collection<Persona> getPersonaByName(String partialName) throws CentralRepoException {
String queryClause = PERSONA_QUERY String queryClause = PERSONA_QUERY
+ "WHERE LOWER(p.name) LIKE " + "LOWER('%" + partialName + "%')" ; + "WHERE p.status_id != " + PersonaStatus.DELETED.status_id +
" AND LOWER(p.name) LIKE " + "LOWER('%" + partialName + "%')" ;
PersonaQueryCallback queryCallback = new PersonaQueryCallback(); PersonaQueryCallback queryCallback = new PersonaQueryCallback();
CentralRepository.getInstance().executeSelectSQL(queryClause, queryCallback); CentralRepository.getInstance().executeSelectSQL(queryClause, queryCallback);

View File

@ -53,3 +53,4 @@ AddAccountDialog.confidenceLbl.text=Confidence:
AddAccountDialog.typeLbl.text=Type: AddAccountDialog.typeLbl.text=Type:
AddAccountDialog.identiferLbl.text=Identifier: AddAccountDialog.identiferLbl.text=Identifier:
AddAccountDialog.identifierTextField.text= AddAccountDialog.identifierTextField.text=
PersonaManagerTopComponent.deleteBtn.text=Delete Persona

View File

@ -560,7 +560,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
void clear() { void clear() {
currentPersona = null; currentPersona = null;
nameField.setText(Persona.getDefaultName()); nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : "");
currentAccounts = new ArrayList<>(); currentAccounts = new ArrayList<>();
currentMetadata = new ArrayList<>(); currentMetadata = new ArrayList<>();
currentAliases = new ArrayList<>(); currentAliases = new ArrayList<>();
@ -714,8 +714,8 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel {
} }
@Messages({ @Messages({
"PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs two or more accounts", "PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account",
"PersonaDetailsPanel_NotEnoughAccounts_Title=Not enough accounts", "PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account",
"PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository", "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository",
"PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure", "PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure",
"PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty", "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty",

View File

@ -77,7 +77,8 @@
<Component id="createBtn" min="-2" max="-2" attributes="0"/> <Component id="createBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="editBtn" min="-2" max="-2" attributes="0"/> <Component id="editBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
<Component id="deleteBtn" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Component id="resultsPane" pref="0" max="32767" attributes="0"/> <Component id="resultsPane" pref="0" max="32767" attributes="0"/>
<Component id="searchField" max="32767" attributes="0"/> <Component id="searchField" max="32767" attributes="0"/>
@ -110,6 +111,7 @@
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="editBtn" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="editBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="createBtn" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="createBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deleteBtn" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
@ -208,6 +210,14 @@
<AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="true"/> <AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
</AuxValues> </AuxValues>
</Component> </Component>
<Component class="javax.swing.JButton" name="deleteBtn">
<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="PersonaManagerTopComponent.deleteBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel" name="detailsPanel"> <Component class="org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel" name="detailsPanel">

View File

@ -30,6 +30,7 @@ import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.openide.windows.RetainLocation; import org.openide.windows.RetainLocation;
import org.openide.windows.TopComponent; import org.openide.windows.TopComponent;
@ -54,7 +55,9 @@ public final class PersonaManagerTopComponent extends TopComponent {
private Persona selectedPersona = null; private Persona selectedPersona = null;
@Messages({ @Messages({
"PMTopComponent_Name=Persona Manager" "PMTopComponent_Name=Persona Manager",
"PMTopComponent_delete_exception_Title=Delete failure",
"PMTopComponent_delete_exception_msg=Failed to delete persona",
}) })
public PersonaManagerTopComponent() { public PersonaManagerTopComponent() {
initComponents(); initComponents();
@ -83,6 +86,25 @@ public final class PersonaManagerTopComponent extends TopComponent {
PersonaDetailsMode.CREATE, selectedPersona, new CreateEditCallbackImpl()); PersonaDetailsMode.CREATE, selectedPersona, new CreateEditCallbackImpl());
} }
}); });
deleteBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
if (selectedPersona != null) {
selectedPersona.delete();
}
} catch (CentralRepoException ex) {
logger.log(Level.SEVERE, "Failed to delete persona: " + selectedPersona.getName(), ex);
JOptionPane.showMessageDialog(PersonaManagerTopComponent.this,
Bundle.PMTopComponent_delete_exception_msg(),
Bundle.PMTopComponent_delete_exception_Title(),
JOptionPane.ERROR_MESSAGE);
return;
}
executeSearch();
}
});
// Results table // Results table
resultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); resultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@ -116,6 +138,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
Persona persona = currentResults.get(index); Persona persona = currentResults.get(index);
selectedPersona = persona; selectedPersona = persona;
editBtn.setEnabled(true); editBtn.setEnabled(true);
deleteBtn.setEnabled(true);
} }
/** /**
@ -147,6 +170,8 @@ public final class PersonaManagerTopComponent extends TopComponent {
if (selectedRow != -1) { if (selectedRow != -1) {
setPersona(resultsTable.getSelectedRow()); setPersona(resultsTable.getSelectedRow());
detailsPanel.setMode(this, PersonaDetailsMode.VIEW, selectedPersona); detailsPanel.setMode(this, PersonaDetailsMode.VIEW, selectedPersona);
} else {
detailsPanel.clear();
} }
} }
@ -189,6 +214,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
resultsTable.clearSelection(); resultsTable.clearSelection();
updateResultsTable(results); updateResultsTable(results);
editBtn.setEnabled(false); editBtn.setEnabled(false);
deleteBtn.setEnabled(false);
} }
@Override @Override
@ -216,6 +242,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
searchBtn = new javax.swing.JButton(); searchBtn = new javax.swing.JButton();
editBtn = new javax.swing.JButton(); editBtn = new javax.swing.JButton();
createBtn = new javax.swing.JButton(); createBtn = new javax.swing.JButton();
deleteBtn = new javax.swing.JButton();
detailsPanel = new org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel(); detailsPanel = new org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel();
setMinimumSize(new java.awt.Dimension(400, 400)); setMinimumSize(new java.awt.Dimension(400, 400));
@ -246,6 +273,9 @@ public final class PersonaManagerTopComponent extends TopComponent {
org.openide.awt.Mnemonics.setLocalizedText(createBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.createBtn.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(createBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.createBtn.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(deleteBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.deleteBtn.text")); // NOI18N
deleteBtn.setEnabled(false);
javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel); javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
searchPanel.setLayout(searchPanelLayout); searchPanel.setLayout(searchPanelLayout);
searchPanelLayout.setHorizontalGroup( searchPanelLayout.setHorizontalGroup(
@ -257,7 +287,8 @@ public final class PersonaManagerTopComponent extends TopComponent {
.addComponent(createBtn) .addComponent(createBtn)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editBtn) .addComponent(editBtn)
.addGap(0, 0, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(deleteBtn))
.addComponent(resultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addComponent(resultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(searchField) .addComponent(searchField)
.addGroup(searchPanelLayout.createSequentialGroup() .addGroup(searchPanelLayout.createSequentialGroup()
@ -283,7 +314,8 @@ public final class PersonaManagerTopComponent extends TopComponent {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(editBtn) .addComponent(editBtn)
.addComponent(createBtn)) .addComponent(createBtn)
.addComponent(deleteBtn))
.addContainerGap()) .addContainerGap())
); );
@ -304,6 +336,7 @@ public final class PersonaManagerTopComponent extends TopComponent {
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton createBtn; private javax.swing.JButton createBtn;
private javax.swing.JButton deleteBtn;
private org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel detailsPanel; private org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel detailsPanel;
private javax.swing.JButton editBtn; private javax.swing.JButton editBtn;
private javax.swing.JSplitPane jSplitPane1; private javax.swing.JSplitPane jSplitPane1;