mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 07:56:16 +00:00
Merge branch 'develop' of github.com:sleuthkit/autopsy into develop
This commit is contained in:
commit
26e01a6cb0
@ -345,7 +345,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
|
||||
}
|
||||
|
||||
static Map<Long, String> getImagePaths(SleuthkitCase db) { //TODO: clean this up
|
||||
Map<Long, String> imgPaths = new HashMap<Long, String>();
|
||||
Map<Long, String> imgPaths = new HashMap<>();
|
||||
try {
|
||||
Map<Long, List<String>> imgPathsList = db.getImagePaths();
|
||||
for (Map.Entry<Long, List<String>> entry : imgPathsList.entrySet()) {
|
||||
@ -721,7 +721,20 @@ public class Case implements SleuthkitCase.ErrorObserver {
|
||||
return xmlcm.getExportDir();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the full path to the log directory for this case.
|
||||
*
|
||||
* @return The log directory path.
|
||||
*/
|
||||
public String getLogDirectoryPath() {
|
||||
if (xmlcm == null) {
|
||||
return "";
|
||||
} else {
|
||||
return xmlcm.getLogDir();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get the created date of this case
|
||||
*
|
||||
|
@ -66,7 +66,7 @@ public class CoreComponentControl {
|
||||
|
||||
// find the data content top component
|
||||
TopComponent contentWin = DataContentTopComponent.findInstance();
|
||||
Mode m = WindowManager.getDefault().findMode("output");
|
||||
Mode m = WindowManager.getDefault().findMode("output"); //NON-NLS
|
||||
if (m != null) {
|
||||
m.dockInto(contentWin); // redock into the output mode
|
||||
} else {
|
||||
|
@ -18,8 +18,12 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.coreutils;
|
||||
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.*;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
|
||||
/**
|
||||
* Autopsy specialization of the Java Logger class with custom file handlers.
|
||||
@ -27,18 +31,47 @@ import java.util.logging.*;
|
||||
public final class Logger extends java.util.logging.Logger {
|
||||
|
||||
private static final String LOG_ENCODING = PlatformUtil.getLogFileEncoding();
|
||||
private static final String LOG_DIR = PlatformUtil.getLogDirectory();
|
||||
private static final int LOG_SIZE = 0; // In bytes, zero is unlimited
|
||||
private static final int LOG_FILE_COUNT = 10;
|
||||
private static final String LOG_WITHOUT_STACK_TRACES = "autopsy.log"; //NON-NLS
|
||||
private static final String LOG_WITH_STACK_TRACES = "autopsy_traces.log"; //NON-NLS
|
||||
private static final FileHandler userFriendlyLogFile = createFileHandler(LOG_WITHOUT_STACK_TRACES);
|
||||
private static final FileHandler developersLogFile = createFileHandler(LOG_WITH_STACK_TRACES);
|
||||
private static final CaseChangeListener caseChangeListener = new CaseChangeListener();
|
||||
private static final Handler console = new java.util.logging.ConsoleHandler();
|
||||
private static FileHandler userFriendlyLogFile = createFileHandler(PlatformUtil.getLogDirectory(), LOG_WITHOUT_STACK_TRACES);
|
||||
private static FileHandler developersLogFile = createFileHandler(PlatformUtil.getLogDirectory(), LOG_WITH_STACK_TRACES);
|
||||
|
||||
private static FileHandler createFileHandler(String fileName) {
|
||||
static {
|
||||
Case.addPropertyChangeListener(caseChangeListener);
|
||||
}
|
||||
|
||||
private static class CaseChangeListener implements PropertyChangeListener {
|
||||
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent event) {
|
||||
if (event.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// Write to logs in the Logs directory of the current case, or
|
||||
// to logs in the user directory when there is no case.
|
||||
if (event.getNewValue() != null) {
|
||||
String logDirectoryPath = ((Case) event.getNewValue()).getLogDirectoryPath();
|
||||
if (!logDirectoryPath.isEmpty()) {
|
||||
userFriendlyLogFile.close();
|
||||
userFriendlyLogFile = createFileHandler(logDirectoryPath, LOG_WITHOUT_STACK_TRACES);
|
||||
developersLogFile.close();
|
||||
developersLogFile = createFileHandler(logDirectoryPath, LOG_WITH_STACK_TRACES);
|
||||
}
|
||||
} else {
|
||||
userFriendlyLogFile.close();
|
||||
userFriendlyLogFile = createFileHandler(PlatformUtil.getLogDirectory(), LOG_WITHOUT_STACK_TRACES);
|
||||
developersLogFile.close();
|
||||
developersLogFile = createFileHandler(PlatformUtil.getLogDirectory(), LOG_WITH_STACK_TRACES);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static FileHandler createFileHandler(String logDirectory, String fileName) {
|
||||
try {
|
||||
FileHandler f = new FileHandler(LOG_DIR + fileName, LOG_SIZE, LOG_FILE_COUNT);
|
||||
FileHandler f = new FileHandler(logDirectory + File.separator + fileName, LOG_SIZE, LOG_FILE_COUNT);
|
||||
f.setEncoding(LOG_ENCODING);
|
||||
f.setFormatter(new SimpleFormatter());
|
||||
return f;
|
||||
@ -113,9 +146,9 @@ public final class Logger extends java.util.logging.Logger {
|
||||
private void logUserFriendlyOnly(Level level, String message, Throwable thrown) {
|
||||
removeHandler(developersLogFile);
|
||||
super.log(level, "{0}\nException: {1}", new Object[]{message, thrown.toString()}); //NON-NLS
|
||||
addHandler(developersLogFile);
|
||||
addHandler(developersLogFile);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {
|
||||
removeHandler(userFriendlyLogFile);
|
||||
|
@ -27,7 +27,7 @@ final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJ
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private boolean skipFilesWithNoExtension = true;
|
||||
private boolean skipFilesWithTextPlainMimeType = false;
|
||||
private boolean skipFilesWithTextPlainMimeType = true;
|
||||
|
||||
FileExtMismatchDetectorModuleSettings() {
|
||||
}
|
||||
|
@ -223,7 +223,9 @@
|
||||
<ext>jpe</ext>
|
||||
<ext>jpeg</ext>
|
||||
<ext>jpg</ext>
|
||||
<ext>jpg:ms-thumbnail</ext>
|
||||
<ext>png</ext>
|
||||
<ext>tile</ext>
|
||||
</signature>
|
||||
<signature mimetype="image/png">
|
||||
<ext>gif</ext>
|
||||
@ -264,6 +266,7 @@
|
||||
<ext>adm</ext>
|
||||
<ext>admx</ext>
|
||||
<ext>aff</ext>
|
||||
<ext>appcontent-ms</ext>
|
||||
<ext>arff</ext>
|
||||
<ext>ashx</ext>
|
||||
<ext>asp</ext>
|
||||
@ -300,6 +303,7 @@
|
||||
<ext>dun</ext>
|
||||
<ext>ecf</ext>
|
||||
<ext>elm</ext>
|
||||
<ext>eml</ext>
|
||||
<ext>eng</ext>
|
||||
<ext>ent</ext>
|
||||
<ext>enu</ext>
|
||||
@ -398,6 +402,7 @@
|
||||
<ext>sql</ext>
|
||||
<ext>std</ext>
|
||||
<ext>stp</ext>
|
||||
<ext>strings</ext>
|
||||
<ext>sve</ext>
|
||||
<ext>sve</ext>
|
||||
<ext>svg</ext>
|
||||
|
@ -70,7 +70,7 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe
|
||||
customizeHashSetsTable(jScrollPane2, knownBadHashTable, knownBadHashSetsTableModel);
|
||||
alwaysCalcHashesCheckbox.setSelected(settings.shouldCalculateHashes());
|
||||
hashDbManager.addPropertyChangeListener(this);
|
||||
alwaysCalcHashesCheckbox.setText("<html>" + org.openide.util.NbBundle.getMessage(HashLookupModuleSettingsPanel.class, "HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text") + "</html>"); // NOI18N
|
||||
alwaysCalcHashesCheckbox.setText("<html>" + org.openide.util.NbBundle.getMessage(HashLookupModuleSettingsPanel.class, "HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text") + "</html>"); // NOI18N NON-NLS
|
||||
}
|
||||
|
||||
private void customizeHashSetsTable(JScrollPane scrollPane, JTable table, HashSetsTableModel tableModel) {
|
||||
|
@ -238,7 +238,7 @@ class DropdownListSearchPanel extends KeywordSearchPanel {
|
||||
}
|
||||
});
|
||||
|
||||
ingestIndexLabel.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
|
||||
ingestIndexLabel.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N NON-NLS
|
||||
ingestIndexLabel.setText(org.openide.util.NbBundle.getMessage(DropdownListSearchPanel.class, "KeywordSearchListsViewerPanel.ingestIndexLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
|
@ -143,13 +143,13 @@ class DropdownToolbar extends javax.swing.JPanel {
|
||||
|
||||
setOpaque(false);
|
||||
|
||||
listsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png"))); // NOI18N
|
||||
listsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png"))); // NOI18N NON-NLS
|
||||
listsButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class, "ListBundleName")); // NOI18N
|
||||
listsButton.setBorderPainted(false);
|
||||
listsButton.setContentAreaFilled(false);
|
||||
listsButton.setEnabled(false);
|
||||
listsButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png"))); // NOI18N
|
||||
listsButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png"))); // NOI18N
|
||||
listsButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png"))); // NOI18N NON-NLS
|
||||
listsButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png"))); // NOI18N NON-NLS
|
||||
listsButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||
public void mousePressed(java.awt.event.MouseEvent evt) {
|
||||
listsButtonMousePressed(evt);
|
||||
@ -161,7 +161,7 @@ class DropdownToolbar extends javax.swing.JPanel {
|
||||
}
|
||||
});
|
||||
|
||||
searchDropButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png"))); // NOI18N
|
||||
searchDropButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png"))); // NOI18N NON-NLS
|
||||
searchDropButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class, "KeywordSearchPanel.searchDropButton.text")); // NOI18N
|
||||
searchDropButton.setBorderPainted(false);
|
||||
searchDropButton.setContentAreaFilled(false);
|
||||
@ -169,8 +169,8 @@ class DropdownToolbar extends javax.swing.JPanel {
|
||||
searchDropButton.setMaximumSize(new java.awt.Dimension(146, 27));
|
||||
searchDropButton.setMinimumSize(new java.awt.Dimension(146, 27));
|
||||
searchDropButton.setPreferredSize(new java.awt.Dimension(146, 27));
|
||||
searchDropButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png"))); // NOI18N
|
||||
searchDropButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png"))); // NOI18N
|
||||
searchDropButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png"))); // NOI18N NON-NLS
|
||||
searchDropButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png"))); // NOI18N NON-NLS
|
||||
searchDropButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||
public void mousePressed(java.awt.event.MouseEvent evt) {
|
||||
searchDropButtonMousePressed(evt);
|
||||
|
@ -113,7 +113,7 @@ class GlobalListsManagementPanel extends javax.swing.JPanel implements OptionsPa
|
||||
});
|
||||
jScrollPane1.setViewportView(listsTable);
|
||||
|
||||
newListButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/new16.png"))); // NOI18N
|
||||
newListButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/new16.png"))); // NOI18N NON-NLS
|
||||
newListButton.setText(org.openide.util.NbBundle.getMessage(GlobalListsManagementPanel.class, "KeywordSearchListsManagementPanel.newListButton.text")); // NOI18N
|
||||
newListButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
@ -121,7 +121,7 @@ class GlobalListsManagementPanel extends javax.swing.JPanel implements OptionsPa
|
||||
}
|
||||
});
|
||||
|
||||
importButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/import16.png"))); // NOI18N
|
||||
importButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/import16.png"))); // NOI18N NON-NLS
|
||||
importButton.setText(org.openide.util.NbBundle.getMessage(GlobalListsManagementPanel.class, "KeywordSearchListsManagementPanel.importButton.text")); // NOI18N
|
||||
importButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
|
@ -64,7 +64,7 @@ public final class KeywordSearchJobSettingsPanel extends IngestModuleIngestJobSe
|
||||
displayLanguages();
|
||||
displayEncodings();
|
||||
keywordListsManager.addPropertyChangeListener(this);
|
||||
languagesLabel.setText("<html>" + org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.languagesLabel.text") + "</html>"); // NOI18N
|
||||
languagesLabel.setText("<html>" + org.openide.util.NbBundle.getMessage(KeywordSearchJobSettingsPanel.class, "KeywordSearchJobSettingsPanel.languagesLabel.text") + "</html>"); // NOI18N NON-NLS
|
||||
}
|
||||
|
||||
private void customizeKeywordListsTable() {
|
||||
|
@ -91,7 +91,7 @@ public class Server {
|
||||
TEXT {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "text";
|
||||
return "text"; //NON-NLS
|
||||
}
|
||||
},
|
||||
CONTENT_WS {
|
||||
|
@ -447,12 +447,14 @@ class ExtractRegistry extends Extract {
|
||||
String model = dev;
|
||||
if (dev.toLowerCase().contains("vid")) { //NON-NLS
|
||||
USBInfo info = extrctr.parseAndLookup(dev);
|
||||
if(info.getVendor()!=null)
|
||||
if (info.getVendor() != null) {
|
||||
bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE.getTypeID(),
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"ExtractRegistry.parentModuleName.noSpace"), info.getVendor()));
|
||||
if(info.getProduct() != null)
|
||||
}
|
||||
if (info.getProduct() != null) {
|
||||
model = info.getProduct();
|
||||
}
|
||||
}
|
||||
bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL.getTypeID(),
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
|
@ -63,20 +63,29 @@ class UsbDeviceIdMapper {
|
||||
*/
|
||||
public USBInfo parseAndLookup(String dev) {
|
||||
String[] dtokens = dev.split("[_&]");
|
||||
String vID = dtokens[1];
|
||||
String vID = dtokens[1].toUpperCase();
|
||||
String pID;
|
||||
if (dtokens.length < 4 || dtokens[3].length() < 4) {
|
||||
pID = "0000";
|
||||
} else {
|
||||
pID = dtokens[3];
|
||||
}
|
||||
pID = pID.toUpperCase();
|
||||
|
||||
// first try the full key
|
||||
String key = vID + pID;
|
||||
key = key.toUpperCase();
|
||||
if (!devices.containsKey(key)) {
|
||||
return new USBInfo(null, null);
|
||||
} else {
|
||||
if (devices.containsKey(key)) {
|
||||
return devices.get(key);
|
||||
}
|
||||
|
||||
// try just the vendor ID -> In case database doesn't know about this specific product
|
||||
key = vID + "0000";
|
||||
if (devices.containsKey(key)) {
|
||||
USBInfo info = devices.get(key);
|
||||
return new USBInfo(info.getVendor(), "Product: " + pID);
|
||||
}
|
||||
|
||||
return new USBInfo(null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -152,8 +161,8 @@ class UsbDeviceIdMapper {
|
||||
* Stores the vendor information about a USB device
|
||||
*/
|
||||
public class USBInfo {
|
||||
private String vendor;
|
||||
private String product;
|
||||
private final String vendor;
|
||||
private final String product;
|
||||
|
||||
private USBInfo(String vend, String prod) {
|
||||
vendor = vend;
|
||||
|
@ -142,7 +142,7 @@ class TestRunner(object):
|
||||
test_data.printerror = Errors.printerror
|
||||
# give solr process time to die.
|
||||
time.sleep(10)
|
||||
|
||||
print("Total ingest time was " + test_data.total_ingest_time)
|
||||
Reports.write_html_foot(test_config.html_log)
|
||||
|
||||
if test_config.jenkins:
|
||||
@ -1226,7 +1226,6 @@ class Logs(object):
|
||||
version_line = search_logs("INFO: Application name: Autopsy, version:", test_data)[0]
|
||||
test_data.autopsy_version = get_word_at(version_line, 5).rstrip(",")
|
||||
test_data.heap_space = search_logs("Heap memory usage:", test_data)[0].rstrip().split(": ")[1]
|
||||
|
||||
ingest_line = search_logs("Ingest (including enqueue)", test_data)[0]
|
||||
test_data.total_ingest_time = get_word_at(ingest_line, 6).rstrip()
|
||||
|
||||
@ -1361,11 +1360,22 @@ def copy_logs(test_data):
|
||||
test_data: the TestData whose logs will be copied
|
||||
"""
|
||||
try:
|
||||
log_dir = os.path.join("..", "..", "Testing","build","test","qa-functional","work","userdir0","var","log")
|
||||
# copy logs from autopsy case's Log folder
|
||||
log_dir = os.path.join(test_data.output_path, AUTOPSY_TEST_CASE, "Log")
|
||||
shutil.copytree(log_dir, test_data.logs_dir)
|
||||
|
||||
# copy logs from userdir0/var/log
|
||||
log_dir = os.path.join("..", "..", "Testing","build","test","qa-functional","work","userdir0","var","log/")
|
||||
for log in os.listdir(log_dir):
|
||||
if log.find("log"):
|
||||
new_name = log_dir + "userdir0." + log
|
||||
log = log_dir + log
|
||||
shutil.move(log, new_name)
|
||||
shutil.copy(new_name, test_data.logs_dir)
|
||||
shutil.move(new_name, log)
|
||||
except OSError as e:
|
||||
printerror(test_data,"Error: Failed to copy the logs.")
|
||||
printerror(test_data,str(e) + "\n")
|
||||
print_error(test_data,"Error: Failed to copy the logs.")
|
||||
print_error(test_data,str(e) + "\n")
|
||||
logging.warning(traceback.format_exc())
|
||||
|
||||
def setDay():
|
||||
@ -1556,15 +1566,11 @@ class Args(object):
|
||||
arg = sys.argv.pop(0)
|
||||
nxtproc.append(arg)
|
||||
if(arg == "-f"):
|
||||
#try: @@@ Commented out until a more specific except statement is added
|
||||
arg = sys.argv.pop(0)
|
||||
print("Running on a single file:")
|
||||
print(path_fix(arg) + "\n")
|
||||
self.single = True
|
||||
self.single_file = path_fix(arg)
|
||||
#except:
|
||||
# print("Error: No single file given.\n")
|
||||
# return False
|
||||
elif(arg == "-r" or arg == "--rebuild"):
|
||||
print("Running in rebuild mode.\n")
|
||||
self.rebuild = True
|
||||
@ -1757,8 +1763,8 @@ def clear_dir(dir):
|
||||
os.makedirs(dir)
|
||||
return True;
|
||||
except OSError as e:
|
||||
printerror(test_data,"Error: Cannot clear the given directory:")
|
||||
printerror(test_data,dir + "\n")
|
||||
print_error(test_data,"Error: Cannot clear the given directory:")
|
||||
print_error(test_data,dir + "\n")
|
||||
print(str(e))
|
||||
return False;
|
||||
|
||||
@ -1773,8 +1779,8 @@ def del_dir(dir):
|
||||
shutil.rmtree(dir)
|
||||
return True;
|
||||
except:
|
||||
printerror(test_data,"Error: Cannot delete the given directory:")
|
||||
printerror(test_data,dir + "\n")
|
||||
print_error(test_data,"Error: Cannot delete the given directory:")
|
||||
print_error(test_data,dir + "\n")
|
||||
return False;
|
||||
|
||||
def get_file_in_dir(dir, ext):
|
||||
|
@ -289,7 +289,7 @@ def replace_id(line, table):
|
||||
if (files_index != -1):
|
||||
obj_id = fields_list[0]
|
||||
path = table[int(obj_id)]
|
||||
newLine = ('INSERT INTO "tsk_files" VALUES(' + path + ', '.join(fields_list[1:]) + ');')
|
||||
newLine = ('INSERT INTO "tsk_files" VALUES(' + ', '.join(fields_list[1:]) + ');')
|
||||
return newLine
|
||||
|
||||
elif (path_index != -1):
|
||||
|
Loading…
x
Reference in New Issue
Block a user