mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-06 21:00:22 +00:00
file upload changes
This commit is contained in:
parent
b3bafd8a22
commit
14d8a09288
@ -25,6 +25,7 @@ import com.basistech.df.cybertriage.autopsy.ctapi.json.CTCloudBean;
|
|||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.CTCloudBeanResponse;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.CTCloudBeanResponse;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.DecryptedLicenseResponse;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.DecryptedLicenseResponse;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.FileReputationRequest;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.FileReputationRequest;
|
||||||
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.FileUploadRequest;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseRequest;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseRequest;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseResponse;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseResponse;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.MetadataUploadRequest;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.MetadataUploadRequest;
|
||||||
@ -92,8 +93,8 @@ public class CTApiDAO {
|
|||||||
return httpClient.doPost(AUTH_TOKEN_REQUEST_PATH, authTokenRequest, AuthTokenResponse.class);
|
return httpClient.doPost(AUTH_TOKEN_REQUEST_PATH, authTokenRequest, AuthTokenResponse.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void uploadFile(String url, String fileName, InputStream fileIs) throws CTCloudException {
|
public void uploadFile(FileUploadRequest fileUploadRequest) throws CTCloudException {
|
||||||
httpClient.doFileUploadPut(url, fileName, fileIs);
|
httpClient.doFileUploadPut(fileUploadRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void uploadMeta(AuthenticatedRequestData authenticatedRequestData, MetadataUploadRequest metaRequest) throws CTCloudException {
|
public void uploadMeta(AuthenticatedRequestData authenticatedRequestData, MetadataUploadRequest metaRequest) throws CTCloudException {
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.basistech.df.cybertriage.autopsy.ctapi;
|
package com.basistech.df.cybertriage.autopsy.ctapi;
|
||||||
|
|
||||||
|
import com.basistech.df.cybertriage.autopsy.ctapi.CTCloudException.ErrorCode;
|
||||||
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.FileUploadRequest;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil;
|
import com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -63,7 +65,6 @@ import org.apache.http.client.utils.URIBuilder;
|
|||||||
import org.apache.http.entity.ContentType;
|
import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.InputStreamEntity;
|
import org.apache.http.entity.InputStreamEntity;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.entity.mime.MultipartEntityBuilder;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.apache.http.impl.client.HttpClients;
|
import org.apache.http.impl.client.HttpClients;
|
||||||
@ -186,10 +187,23 @@ class CTCloudHttpClient {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doFileUploadPut(String fullUrlPath, String fileName, InputStream fileIs) throws CTCloudException {
|
public void doFileUploadPut(FileUploadRequest fileUploadRequest) throws CTCloudException {
|
||||||
URI postUri;
|
if (fileUploadRequest == null) {
|
||||||
|
throw new CTCloudException(ErrorCode.BAD_REQUEST, new IllegalArgumentException("fileUploadRequest cannot be null"));
|
||||||
|
}
|
||||||
|
|
||||||
|
String fullUrlPath = fileUploadRequest.getFullUrlPath();
|
||||||
|
String fileName = fileUploadRequest.getFileName();
|
||||||
|
InputStream fileInputStream = fileUploadRequest.getFileInputStream();
|
||||||
|
Long contentLength = fileUploadRequest.getContentLength();
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(fullUrlPath) || fileInputStream == null || contentLength == null || contentLength <= 0) {
|
||||||
|
throw new CTCloudException(ErrorCode.BAD_REQUEST, new IllegalArgumentException("fullUrlPath, fileInputStream, contentLength must not be empty, null or less than 0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
URI putUri;
|
||||||
try {
|
try {
|
||||||
postUri = new URI(fullUrlPath);
|
putUri = new URI(fullUrlPath);
|
||||||
} catch (URISyntaxException ex) {
|
} catch (URISyntaxException ex) {
|
||||||
LOGGER.log(Level.WARNING, "Wrong URL syntax for CT Cloud " + fullUrlPath, ex);
|
LOGGER.log(Level.WARNING, "Wrong URL syntax for CT Cloud " + fullUrlPath, ex);
|
||||||
throw new CTCloudException(CTCloudException.ErrorCode.UNKNOWN, ex);
|
throw new CTCloudException(CTCloudException.ErrorCode.UNKNOWN, ex);
|
||||||
@ -197,24 +211,11 @@ class CTCloudHttpClient {
|
|||||||
|
|
||||||
try (CloseableHttpClient httpclient = createConnection(proxySelector, sslContext)) {
|
try (CloseableHttpClient httpclient = createConnection(proxySelector, sslContext)) {
|
||||||
LOGGER.log(Level.INFO, "initiating http post request to ctcloud server " + fullUrlPath);
|
LOGGER.log(Level.INFO, "initiating http post request to ctcloud server " + fullUrlPath);
|
||||||
HttpPut put = new HttpPut(postUri);
|
HttpPut put = new HttpPut(putUri);
|
||||||
configureRequestTimeout(put);
|
configureRequestTimeout(put);
|
||||||
|
|
||||||
put.addHeader("Connection", "keep-alive");
|
put.addHeader("Connection", "keep-alive");
|
||||||
put.addHeader("Content-Type", "application/octet-stream");
|
put.setEntity(new InputStreamEntity(fileInputStream, contentLength, ContentType.APPLICATION_OCTET_STREAM));
|
||||||
|
|
||||||
// MultipartEntityBuilder builder = MultipartEntityBuilder.create();
|
|
||||||
// builder.addBinaryBody(
|
|
||||||
// "file",
|
|
||||||
// fileBytes,
|
|
||||||
// ContentType.APPLICATION_OCTET_STREAM,
|
|
||||||
// file.getFileName()
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// HttpEntity multipart = builder.build();
|
|
||||||
// post.setEntity(multipart);
|
|
||||||
|
|
||||||
put.setEntity(new InputStreamEntity(fileIs));
|
|
||||||
|
|
||||||
try (CloseableHttpResponse response = httpclient.execute(put)) {
|
try (CloseableHttpResponse response = httpclient.execute(put)) {
|
||||||
int statusCode = response.getStatusLine().getStatusCode();
|
int statusCode = response.getStatusLine().getStatusCode();
|
||||||
@ -386,7 +387,7 @@ class CTCloudHttpClient {
|
|||||||
HttpClientBuilder builder;
|
HttpClientBuilder builder;
|
||||||
|
|
||||||
if (ProxySettings.getProxyType() != ProxySettings.DIRECT_CONNECTION
|
if (ProxySettings.getProxyType() != ProxySettings.DIRECT_CONNECTION
|
||||||
&& StringUtils.isBlank(ProxySettings.getAuthenticationUsername())
|
&& StringUtils.isBlank(ProxySettings.getAuthenticationUsername())
|
||||||
&& ArrayUtils.isEmpty(ProxySettings.getAuthenticationPassword())
|
&& ArrayUtils.isEmpty(ProxySettings.getAuthenticationPassword())
|
||||||
&& WinHttpClients.isWinAuthAvailable()) {
|
&& WinHttpClients.isWinAuthAvailable()) {
|
||||||
|
|
||||||
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2023 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.basistech.df.cybertriage.autopsy.ctapi.json;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data for a file upload request.
|
||||||
|
*/
|
||||||
|
public class FileUploadRequest {
|
||||||
|
|
||||||
|
private String fullUrlPath;
|
||||||
|
private String fileName;
|
||||||
|
private InputStream fileInputStream;
|
||||||
|
private Long contentLength;
|
||||||
|
|
||||||
|
public String getFullUrlPath() {
|
||||||
|
return fullUrlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadRequest setFullUrlPath(String fullUrlPath) {
|
||||||
|
this.fullUrlPath = fullUrlPath;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFileName() {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadRequest setFileName(String fileName) {
|
||||||
|
this.fileName = fileName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getFileInputStream() {
|
||||||
|
return fileInputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadRequest setFileInputStream(InputStream fileInputStream) {
|
||||||
|
this.fileInputStream = fileInputStream;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getContentLength() {
|
||||||
|
return contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadRequest setContentLength(Long contentLength) {
|
||||||
|
this.contentLength = contentLength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -23,6 +23,7 @@ import com.basistech.df.cybertriage.autopsy.ctapi.CTCloudException;
|
|||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthTokenResponse;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthTokenResponse;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthenticatedRequestData;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthenticatedRequestData;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.CTCloudBean;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.CTCloudBean;
|
||||||
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.FileUploadRequest;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.MalwareResultBean.Status;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.MalwareResultBean.Status;
|
||||||
import com.basistech.df.cybertriage.autopsy.ctapi.json.MetadataUploadRequest;
|
import com.basistech.df.cybertriage.autopsy.ctapi.json.MetadataUploadRequest;
|
||||||
@ -108,7 +109,7 @@ class MalwareScanIngestModule implements FileIngestModule {
|
|||||||
// min and max upload size in bytes
|
// min and max upload size in bytes
|
||||||
private static final long MIN_UPLOAD_SIZE = 1;
|
private static final long MIN_UPLOAD_SIZE = 1;
|
||||||
private static final long MAX_UPLOAD_SIZE = 100_000_000; // 100MB
|
private static final long MAX_UPLOAD_SIZE = 100_000_000; // 100MB
|
||||||
|
|
||||||
private static final int NUM_FILE_UPLOAD_RETRIES = 7;
|
private static final int NUM_FILE_UPLOAD_RETRIES = 7;
|
||||||
private static final long FILE_UPLOAD_RETRY_SLEEP_MILLIS = 60 * 1000;
|
private static final long FILE_UPLOAD_RETRY_SLEEP_MILLIS = 60 * 1000;
|
||||||
|
|
||||||
@ -654,7 +655,13 @@ class MalwareScanIngestModule implements FileIngestModule {
|
|||||||
|
|
||||||
// upload bytes
|
// upload bytes
|
||||||
ReadContentInputStream fileInputStream = new ReadContentInputStream(af);
|
ReadContentInputStream fileInputStream = new ReadContentInputStream(af);
|
||||||
ctApiDAO.uploadFile(authTokenResponse.getFileUploadUrl(), af.getName(), fileInputStream);
|
|
||||||
|
ctApiDAO.uploadFile(new FileUploadRequest()
|
||||||
|
.setContentLength(af.getSize())
|
||||||
|
.setFileInputStream(fileInputStream)
|
||||||
|
.setFileName(af.getName())
|
||||||
|
.setFullUrlPath(authTokenResponse.getFileUploadUrl())
|
||||||
|
);
|
||||||
|
|
||||||
// upload metadata
|
// upload metadata
|
||||||
MetadataUploadRequest metaRequest = new MetadataUploadRequest()
|
MetadataUploadRequest metaRequest = new MetadataUploadRequest()
|
||||||
@ -843,7 +850,7 @@ class MalwareScanIngestModule implements FileIngestModule {
|
|||||||
: Bundle.MalwareScanIngestModule_SharedProcessing_createAnalysisResult_No();
|
: Bundle.MalwareScanIngestModule_SharedProcessing_createAnalysisResult_No();
|
||||||
|
|
||||||
String justification = cloudBean.getMalwareResult().getStatusDescription();
|
String justification = cloudBean.getMalwareResult().getStatusDescription();
|
||||||
|
|
||||||
return ingestJobState.getTskCase().getBlackboard().newAnalysisResult(
|
return ingestJobState.getTskCase().getBlackboard().newAnalysisResult(
|
||||||
ingestJobState.getMalwareType(),
|
ingestJobState.getMalwareType(),
|
||||||
objId,
|
objId,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user