updates for case callback

This commit is contained in:
Greg DiCristofaro 2023-07-10 11:39:37 -04:00
parent 1ea7b215d2
commit ea05b19d71
3 changed files with 4 additions and 115 deletions

View File

@ -18,7 +18,6 @@
*/ */
package org.sleuthkit.autopsy.casemodule; package org.sleuthkit.autopsy.casemodule;
import java.util.Map;
import org.sleuthkit.datamodel.ContentStreamProvider; import org.sleuthkit.datamodel.ContentStreamProvider;
/** /**
@ -35,7 +34,7 @@ public interface AutopsyContentProvider {
* file. * file.
* @return The created content provider or null if arguments are invalid. * @return The created content provider or null if arguments are invalid.
*/ */
ContentStreamProvider load(Map<String, Object> args); ContentStreamProvider load();
/** /**
* Returns the uniquely identifying name of this FileContentProvider. This * Returns the uniquely identifying name of this FileContentProvider. This

View File

@ -2736,9 +2736,7 @@ public class Case {
try { try {
String databaseName = metadata.getCaseDatabaseName(); String databaseName = metadata.getCaseDatabaseName();
ContentStreamProvider contentProvider = loadContentProvider( ContentStreamProvider contentProvider = loadContentProvider(metadata.getContentProviderName());
metadata.getContentProviderName(),
metadata.getContentProviderArgs());
if (CaseType.SINGLE_USER_CASE == metadata.getCaseType()) { if (CaseType.SINGLE_USER_CASE == metadata.getCaseType()) {
// only prefix with metadata directory if databaseName is a relative path // only prefix with metadata directory if databaseName is a relative path
@ -2772,7 +2770,7 @@ public class Case {
* @return The content provider or null if no content provider can be * @return The content provider or null if no content provider can be
* provisioned for the arguments * provisioned for the arguments
*/ */
private static ContentStreamProvider loadContentProvider(String providerName, Map<String, Object> args) { private static ContentStreamProvider loadContentProvider(String providerName) {
Collection<? extends AutopsyContentProvider> customContentProviders = Lookup.getDefault().lookupAll(AutopsyContentProvider.class); Collection<? extends AutopsyContentProvider> customContentProviders = Lookup.getDefault().lookupAll(AutopsyContentProvider.class);
if (customContentProviders != null) { if (customContentProviders != null) {
for (AutopsyContentProvider customProvider : customContentProviders) { for (AutopsyContentProvider customProvider : customContentProviders) {
@ -2781,7 +2779,7 @@ public class Case {
continue; continue;
} }
ContentStreamProvider contentProvider = customProvider.load(args); ContentStreamProvider contentProvider = customProvider.load();
if (contentProvider != null) { if (contentProvider != null) {
return contentProvider; return contentProvider;
} }

View File

@ -120,7 +120,6 @@ public final class CaseMetadata {
*/ */
private static final String SCHEMA_VERSION_SIX = "6.0"; private static final String SCHEMA_VERSION_SIX = "6.0";
private final static String CONTENT_PROVIDER_ELEMENT_NAME = "ContentProvider"; private final static String CONTENT_PROVIDER_ELEMENT_NAME = "ContentProvider";
private final static String CONTENT_PROVIDER_ARGS_ELEMENT_NAME = "Args";
private final static String CONTENT_PROVIDER_NAME_ELEMENT_NAME = "Name"; private final static String CONTENT_PROVIDER_NAME_ELEMENT_NAME = "Name";
private final static String CONTENT_PROVIDER_ARG_DEFAULT_KEY = "DEFAULT"; private final static String CONTENT_PROVIDER_ARG_DEFAULT_KEY = "DEFAULT";
@ -143,7 +142,6 @@ public final class CaseMetadata {
private String createdByVersion; private String createdByVersion;
private CaseMetadata originalMetadata = null; // For portable cases private CaseMetadata originalMetadata = null; // For portable cases
private String contentProviderName; private String contentProviderName;
private Map<String, Object> contentProviderArgs;
/** /**
* Gets the file extension used for case metadata files. * Gets the file extension used for case metadata files.
@ -200,7 +198,6 @@ public final class CaseMetadata {
createdDate = CaseMetadata.DATE_FORMAT.format(new Date()); createdDate = CaseMetadata.DATE_FORMAT.format(new Date());
this.originalMetadata = originalMetadata; this.originalMetadata = originalMetadata;
this.contentProviderName = originalMetadata == null ? null : originalMetadata.contentProviderName; this.contentProviderName = originalMetadata == null ? null : originalMetadata.contentProviderName;
this.contentProviderArgs = originalMetadata == null ? null : originalMetadata.contentProviderArgs;
} }
/** /**
@ -246,14 +243,6 @@ public final class CaseMetadata {
return this.contentProviderName; return this.contentProviderName;
} }
/**
* @return The arguments for the custom provider for content byte data or
* null if no custom provider.
*/
public Map<String, Object> getContentProviderArgs() {
return contentProviderArgs;
}
/** /**
* Gets the full path to the case metadata file. * Gets the full path to the case metadata file.
* *
@ -499,7 +488,6 @@ public final class CaseMetadata {
Element caseElement = doc.createElement(CASE_ELEMENT_NAME); Element caseElement = doc.createElement(CASE_ELEMENT_NAME);
rootElement.appendChild(caseElement); rootElement.appendChild(caseElement);
// serialize content provider args if they exist
Element contentProviderEl = doc.createElement(CONTENT_PROVIDER_ELEMENT_NAME); Element contentProviderEl = doc.createElement(CONTENT_PROVIDER_ELEMENT_NAME);
rootElement.appendChild(contentProviderEl); rootElement.appendChild(contentProviderEl);
@ -508,11 +496,6 @@ public final class CaseMetadata {
contentProviderNameEl.setTextContent(this.contentProviderName); contentProviderNameEl.setTextContent(this.contentProviderName);
} }
contentProviderEl.appendChild(contentProviderNameEl); contentProviderEl.appendChild(contentProviderNameEl);
Element contentProviderArgsEl = doc.createElement(CONTENT_PROVIDER_ARGS_ELEMENT_NAME);
contentProviderEl.appendChild(contentProviderArgsEl);
serializeContentProviderArgs(doc, this.contentProviderArgs, contentProviderArgsEl);
/* /*
* Create the children of the case element. * Create the children of the case element.
@ -600,18 +583,11 @@ public final class CaseMetadata {
this.createdByVersion = getElementTextContent(rootElement, AUTOPSY_CREATED_BY_ELEMENT_NAME, true); this.createdByVersion = getElementTextContent(rootElement, AUTOPSY_CREATED_BY_ELEMENT_NAME, true);
} }
// load content provider args
Element contentProviderEl = getChildElOrNull(rootElement, CONTENT_PROVIDER_ELEMENT_NAME); Element contentProviderEl = getChildElOrNull(rootElement, CONTENT_PROVIDER_ELEMENT_NAME);
if (contentProviderEl != null) { if (contentProviderEl != null) {
Element contentProviderNameEl = getChildElOrNull(contentProviderEl, CONTENT_PROVIDER_NAME_ELEMENT_NAME); Element contentProviderNameEl = getChildElOrNull(contentProviderEl, CONTENT_PROVIDER_NAME_ELEMENT_NAME);
this.contentProviderName = contentProviderNameEl != null ? contentProviderNameEl.getTextContent() : null; this.contentProviderName = contentProviderNameEl != null ? contentProviderNameEl.getTextContent() : null;
Element contentProviderArgsEl = getChildElOrNull(contentProviderEl, CONTENT_PROVIDER_ARGS_ELEMENT_NAME);
Object contentProviderArgs = loadContentProviderArgs(contentProviderArgsEl);
this.contentProviderArgs = (contentProviderArgs instanceof Map) ?
(Map<String, Object>) contentProviderArgs :
Collections.singletonMap(CONTENT_PROVIDER_ARG_DEFAULT_KEY, contentProviderArgs);
} else { } else {
this.contentProviderArgs = null;
this.contentProviderName = null; this.contentProviderName = null;
} }
@ -695,90 +671,6 @@ public final class CaseMetadata {
} }
} }
/**
* Loads custom content provider arguments from an xml element.
* @param element The xml element.
* @return The custom content provider arguments.
*/
private Object loadContentProviderArgs(Element element) {
if (element == null) {
return null;
}
NodeList nodeList = element.getChildNodes();
List<Element> elements = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i) instanceof Element) {
elements.add((Element) nodeList.item(i));
}
}
if (elements.size() > 0) {
String nodeTag = element.getTagName();
boolean childrenHaveSameTag = true;
List<Pair<String, Object>> children = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
Node child = nodeList.item(i);
if (child instanceof Element) {
Element childElement = (Element) child;
String childTagName = childElement.getTagName();
Object childArg = loadContentProviderArgs(childElement);
children.add(Pair.of(childTagName, childArg));
if (childrenHaveSameTag && !childTagName.equalsIgnoreCase(nodeTag)) {
childrenHaveSameTag = false;
}
}
}
if (childrenHaveSameTag) {
return children.stream().map(Pair::getValue).collect(Collectors.toList());
} else {
Map<String, Object> toRet = new HashMap<>();
for (Pair<String, Object> child: children) {
toRet.put(child.getKey(), child.getValue());
}
return toRet;
}
} else {
return element.getTextContent();
}
}
/**
* Serializes custom content provider arguments to an xml element.
* @param doc The root xml document.
* @param arg The argument to serialize.
* @param el The xml element for the argument.
*/
private void serializeContentProviderArgs(Document doc, Object arg, Element el) {
if (arg == null) {
return;
} else if (arg instanceof List) {
String parentTagName = el.getTagName();
List<? extends Object> argList = (List<? extends Object>) arg;
for (Object childArg: argList) {
Element childEl = doc.createElement(parentTagName);
el.appendChild(childEl);
serializeContentProviderArgs(doc, childArg, childEl);
}
} else if (arg instanceof Map) {
Map<? extends Object, ? extends Object> argMap = (Map<? extends Object, ? extends Object>) arg;
for (Entry<? extends Object, ? extends Object> childEntry: argMap.entrySet()) {
String childTag = childEntry.getKey() == null ? null : childEntry.getKey().toString();
if (StringUtils.isBlank(childTag)) {
continue;
}
Element childEl = doc.createElement(childTag);
el.appendChild(childEl);
serializeContentProviderArgs(doc, childEntry.getValue(), childEl);
}
} else {
el.setTextContent(arg.toString());
}
}
/** /**
* Gets the text content of an XML element. * Gets the text content of an XML element.
* *