Merge branch 'develop' of github.com:sleuthkit/autopsy into graphicsEnvHeadless

This commit is contained in:
Greg DiCristofaro 2023-08-23 07:05:18 -04:00
commit cdf93d7000
299 changed files with 17611 additions and 4086 deletions

View File

@ -1,3 +1,6 @@
<!DOCTYPE ivy-module [
<!ENTITY httpcomponents.version "4.5.14">
]>
<ivy-module version="2.0">
<info organisation="org.sleuthkit.autopsy" module="core"/>
<configurations >
@ -72,6 +75,15 @@
<!-- annotations like guarded by -->
<dependency conf="core->default" org="com.github.spotbugs" name="spotbugs-annotations" rev="4.6.0"/>
<dependency conf="core->default" org="com.license4j" name="license4j-runtime-library" rev="4.7.1"/>
<dependency conf="core->default" org="org.apache.httpcomponents" name="httpclient" rev="&httpcomponents.version;"/>
<dependency conf="core->default" org="org.apache.httpcomponents" name="httpmime" rev="&httpcomponents.version;"/>
<dependency conf="core->default" org="org.apache.httpcomponents" name="httpclient-win" rev="&httpcomponents.version;">
<exclude name="jna" />
<exclude name="jna-platform" />
</dependency>
<override org="org.apache.zookeeper" module="zookeeper" rev="3.8.0"/>
<override org="org.apache.zookeeper" module="zookeeper-jute" rev="3.8.0"/>
@ -84,5 +96,6 @@
<override org="org.bouncycastle" module="bcprov-ext-jdk15on" rev="1.70"/>
<override org="org.bouncycastle" module="bcprov-jdk15on" rev="1.70"/>
<override org="org.bouncycastle" module="bcpkix-jdk15on" rev="1.70"/>
<override org="junit" module="junit" rev="4.13.2"/>
</dependencies>
</ivy-module>

View File

@ -4,6 +4,7 @@
<chain name="main">
<ibiblio name="central" root="https://repo1.maven.org/maven2" m2compatible="true"/>
<ibiblio name="maven.restlet.org" root="http://maven.restlet.com" m2compatible="true" />
<ibiblio name="license4j.com" root="http://www.license4j.com/maven/" m2compatible="true" />
</chain>
</resolvers>
<property name="packaging.type" value="jar" />

View File

@ -18,6 +18,7 @@ file.reference.bcprov-jdk15on-1.70.jar=release/modules/ext/bcprov-jdk15on-1.70.j
file.reference.bcutil-jdk15on-1.70.jar=release/modules/ext/bcutil-jdk15on-1.70.jar
file.reference.c3p0-0.9.5.5.jar=release/modules/ext/c3p0-0.9.5.5.jar
file.reference.checker-qual-3.33.0.jar=release/modules/ext/checker-qual-3.33.0.jar
file.reference.commons-codec-1.11.jar=release/modules/ext/commons-codec-1.11.jar
file.reference.commons-dbcp2-2.9.0.jar=release/modules/ext/commons-dbcp2-2.9.0.jar
file.reference.commons-io-2.11.0.jar=release/modules/ext/commons-io-2.11.0.jar
file.reference.commons-lang3-3.10.jar=release/modules/ext/commons-lang3-3.10.jar
@ -31,6 +32,10 @@ file.reference.decodetect-core-0.3.jar=release/modules/ext/decodetect-core-0.3.j
file.reference.error_prone_annotations-2.18.0.jar=release/modules/ext/error_prone_annotations-2.18.0.jar
file.reference.failureaccess-1.0.1.jar=release/modules/ext/failureaccess-1.0.1.jar
file.reference.guava-32.0.1-jre.jar=release/modules/ext/guava-32.0.1-jre.jar
file.reference.httpclient-4.5.14.jar=release/modules/ext/httpclient-4.5.14.jar
file.reference.httpclient-win-4.5.14.jar=release/modules/ext/httpclient-win-4.5.14.jar
file.reference.httpcore-4.4.16.jar=release/modules/ext/httpcore-4.4.16.jar
file.reference.httpmime-4.5.14.jar=release/modules/ext/httpmime-4.5.14.jar
file.reference.icepdf-core-6.2.2.jar=release/modules/ext/icepdf-core-6.2.2.jar
file.reference.icepdf-viewer-6.2.2.jar=release/modules/ext/icepdf-viewer-6.2.2.jar
file.reference.istack-commons-runtime-3.0.11.jar=release/modules/ext/istack-commons-runtime-3.0.11.jar
@ -46,6 +51,7 @@ file.reference.javax.activation-api-1.2.0.jar=release/modules/ext/javax.activati
file.reference.javax.ws.rs-api-2.1.1.jar=release/modules/ext/javax.ws.rs-api-2.1.1.jar
file.reference.jaxb-api-2.3.1.jar=release/modules/ext/jaxb-api-2.3.1.jar
file.reference.jaxb-runtime-2.3.3.jar=release/modules/ext/jaxb-runtime-2.3.3.jar
file.reference.jdom-2.0.5-contrib.jar=release/modules/ext/jdom-2.0.5-contrib.jar
file.reference.jdom-2.0.5.jar=release/modules/ext/jdom-2.0.5.jar
file.reference.jfreechart-1.5.3.jar=release/modules/ext/jfreechart-1.5.3.jar
file.reference.jgraphx-4.2.2.jar=release/modules/ext/jgraphx-4.2.2.jar
@ -55,6 +61,7 @@ file.reference.jutf7-1.0.0.jar=release/modules/ext/jutf7-1.0.0.jar
file.reference.jxmapviewer2-2.6.jar=release/modules/ext/jxmapviewer2-2.6.jar
file.reference.jython-standalone-2.7.2.jar=release/modules/ext/jython-standalone-2.7.2.jar
file.reference.libphonenumber-8.12.45.jar=release/modules/ext/libphonenumber-8.12.45.jar
file.reference.license4j-runtime-library-4.7.1.jar=release/modules/ext/license4j-runtime-library-4.7.1.jar
file.reference.listenablefuture-1.0.jar=release/modules/ext/listenablefuture-1.0.jar
file.reference.logback-classic-1.2.10.jar=release/modules/ext/logback-classic-1.2.10.jar
file.reference.logback-core-1.2.10.jar=release/modules/ext/logback-core-1.2.10.jar

View File

@ -66,6 +66,14 @@
<implementation-version/>
</run-dependency>
</dependency>
<dependency>
<code-name-base>org.netbeans.modules.keyring</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
<specification-version>1.41</specification-version>
</run-dependency>
</dependency>
<dependency>
<code-name-base>org.netbeans.modules.options.api</code-name-base>
<build-prerequisite/>
@ -165,14 +173,6 @@
<specification-version>9.29</specification-version>
</run-dependency>
</dependency>
<!-- <dependency>
<code-name-base>org.openide.filesystems.compat8</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
<specification-version>9.26</specification-version>
</run-dependency>
</dependency> -->
<dependency>
<code-name-base>org.openide.filesystems.nb</code-name-base>
<build-prerequisite/>
@ -323,6 +323,7 @@
</test-type>
</test-dependencies>
<public-packages>
<package>com.basistech.df.cybertriage.autopsy.ctoptions.subpanel</package>
<package>net.sf.sevenzipjbinding</package>
<package>net.sf.sevenzipjbinding.impl</package>
<package>net.sf.sevenzipjbinding.simple</package>
@ -448,6 +449,10 @@
<runtime-relative-path>ext/checker-qual-3.33.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/checker-qual-3.33.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-codec-1.11.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-codec-1.11.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-dbcp2-2.9.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-dbcp2-2.9.0.jar</binary-origin>
@ -500,6 +505,22 @@
<runtime-relative-path>ext/guava-32.0.1-jre.jar</runtime-relative-path>
<binary-origin>release/modules/ext/guava-32.0.1-jre.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpclient-4.5.14.jar</runtime-relative-path>
<binary-origin>release/modules/ext/httpclient-4.5.14.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpclient-win-4.5.14.jar</runtime-relative-path>
<binary-origin>release/modules/ext/httpclient-win-4.5.14.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpcore-4.4.16.jar</runtime-relative-path>
<binary-origin>release/modules/ext/httpcore-4.4.16.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpmime-4.5.14.jar</runtime-relative-path>
<binary-origin>release/modules/ext/httpmime-4.5.14.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/icepdf-core-6.2.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/icepdf-core-6.2.2.jar</binary-origin>
@ -560,6 +581,10 @@
<runtime-relative-path>ext/jaxb-runtime-2.3.3.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jaxb-runtime-2.3.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jdom-2.0.5-contrib.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jdom-2.0.5-contrib.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jdom-2.0.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jdom-2.0.5.jar</binary-origin>
@ -596,6 +621,10 @@
<runtime-relative-path>ext/libphonenumber-8.12.45.jar</runtime-relative-path>
<binary-origin>release/modules/ext/libphonenumber-8.12.45.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/license4j-runtime-library-4.7.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/license4j-runtime-library-4.7.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/listenablefuture-1.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/listenablefuture-1.0.jar</binary-origin>

View File

@ -0,0 +1,9 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTIntegrationMissingDialog.title=Cyber Triage Importer Module Required
CTIntegrationMissingDialog.descriptionLabel.text=<html><body><p>The Cyber Triage Importer Module is required to open this case. </p><p>To open this case:</p><ul><li>Extract the module from the Integrations tab in the Cyber Triage options panel.</li><li>Select the 'Plugins' option from the 'Tools' menu, and go to the 'Downloaded' tab.</li><li>Click 'Add Plugins...' and select the path of the plugin.</li><li>Press 'Install' to finish the installation.</li></ul></body></html>
CTIntegrationMissingDialog.docsLabel.text=<html>For more information, refer to the Cyber Triage Users Guide</html>
CTIntegrationMissingDialog.okButton.text=OK

View File

@ -0,0 +1,9 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTIntegrationMissingDialog.title=Cyber Triage Importer Module Required
CTIntegrationMissingDialog.descriptionLabel.text=<html><body><p>The Cyber Triage Importer Module is required to open this case. </p><p>To open this case:</p><ul><li>Extract the module from the Integrations tab in the Cyber Triage options panel.</li><li>Select the 'Plugins' option from the 'Tools' menu, and go to the 'Downloaded' tab.</li><li>Click 'Add Plugins...' and select the path of the plugin.</li><li>Press 'Install' to finish the installation.</li></ul></body></html>
CTIntegrationMissingDialog.docsLabel.text=<html>For more information, refer to the Cyber Triage Users Guide</html>
CTIntegrationMissingDialog.okButton.text=OK

View File

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/Bundle.properties" key="CTIntegrationMissingDialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="alwaysOnTop" type="boolean" value="true"/>
<Property name="resizable" type="boolean" value="false"/>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-65,0,0,1,-9"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="descriptionLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/Bundle.properties" key="CTIntegrationMissingDialog.descriptionLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[483, 116]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="2" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="docsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/Bundle.properties" key="CTIntegrationMissingDialog.docsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[312, 16]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="link">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="&quot;&lt;html&gt;&lt;span style=\&quot;color: blue; text-decoration: underline\&quot;&gt;&quot; + DOCS_PAGE_URL + &quot;&lt;/span&gt;&lt;/html&gt;&quot;" type="code"/>
</Property>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Hand Cursor"/>
</Property>
</Properties>
<Events>
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="linkMouseClicked"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="paddingPanel">
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="1.0"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Container>
<Component class="javax.swing.JButton" name="okButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/Bundle.properties" key="CTIntegrationMissingDialog.okButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="12" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,165 @@
/*
* 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;
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import javax.swing.JComponent;
import org.sleuthkit.autopsy.coreutils.Logger;
/**
* Provides directions with how to enable CT integration with Autopsy when
* trying to open a CT exported case.
*/
public class CTIntegrationMissingDialog extends javax.swing.JDialog {
private static final String DOCS_PAGE_URL = "https://docs.cybertriage.com/en/latest/chapters/integrations/autopsy.html";
private static final Logger LOGGER = Logger.getLogger(CTIntegrationMissingDialog.class.getName());
/**
* Creates new form CTIntegrationMissingDialog
*/
public CTIntegrationMissingDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JLabel descriptionLabel = new javax.swing.JLabel();
javax.swing.JLabel docsLabel = new javax.swing.JLabel();
link = new javax.swing.JLabel();
javax.swing.JPanel paddingPanel = new javax.swing.JPanel();
javax.swing.JButton okButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(org.openide.util.NbBundle.getMessage(CTIntegrationMissingDialog.class, "CTIntegrationMissingDialog.title")); // NOI18N
setAlwaysOnTop(true);
setResizable(false);
getContentPane().setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(CTIntegrationMissingDialog.class, "CTIntegrationMissingDialog.descriptionLabel.text")); // NOI18N
descriptionLabel.setMinimumSize(new java.awt.Dimension(483, 116));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
getContentPane().add(descriptionLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(docsLabel, org.openide.util.NbBundle.getMessage(CTIntegrationMissingDialog.class, "CTIntegrationMissingDialog.docsLabel.text")); // NOI18N
docsLabel.setMinimumSize(new java.awt.Dimension(312, 16));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 0);
getContentPane().add(docsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(link, "<html><span style=\"color: blue; text-decoration: underline\">" + DOCS_PAGE_URL + "</span></html>");
link.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
link.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
linkMouseClicked(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(link, gridBagConstraints);
javax.swing.GroupLayout paddingPanelLayout = new javax.swing.GroupLayout(paddingPanel);
paddingPanel.setLayout(paddingPanelLayout);
paddingPanelLayout.setHorizontalGroup(
paddingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
paddingPanelLayout.setVerticalGroup(
paddingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weighty = 1.0;
getContentPane().add(paddingPanel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(CTIntegrationMissingDialog.class, "CTIntegrationMissingDialog.okButton.text")); // NOI18N
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.insets = new java.awt.Insets(10, 5, 5, 5);
getContentPane().add(okButton, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
private void linkMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_linkMouseClicked
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(new URI(DOCS_PAGE_URL));
} catch (IOException | URISyntaxException e) {
LOGGER.log(Level.SEVERE, "Error opening link to: " + DOCS_PAGE_URL, e);
}
} else {
LOGGER.log(Level.WARNING, "Desktop API is not supported. Link cannot be opened.");
}
}//GEN-LAST:event_linkMouseClicked
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
dispose();
}//GEN-LAST:event_okButtonActionPerformed
public void showDialog(JComponent parentComp) {
setLocationRelativeTo(parentComp == null ? getParent() : parentComp);
pack();
setVisible(true);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel link;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,133 @@
/*
* 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;
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthTokenRequest;
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.CTCloudBean;
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.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.LicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.json.MetadataUploadRequest;
import com.basistech.df.cybertriage.autopsy.ctapi.util.CTHostIDGenerationUtil;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.Version;
/**
*
* Data access layer for handling the CT api.
*/
public class CTApiDAO {
private static final String LICENSE_REQUEST_PATH = "/_ah/api/license/v1/activate";
private static final String AUTH_TOKEN_REQUEST_PATH = "/_ah/api/auth/v2/generate_token";
private static final String CTCLOUD_SERVER_HASH_PATH = "/_ah/api/reputation/v1/query/file/hash/md5?query_types=CORRELATION,MALWARE";
private static final String CTCLOUD_UPLOAD_FILE_METADATA_PATH = "/_ah/api/reputation/v1/upload/meta";
private static final String AUTOPSY_PRODUCT = "AUTOPSY";
private static final CTApiDAO instance = new CTApiDAO();
private CTApiDAO() {
}
public static CTApiDAO getInstance() {
return instance;
}
private static String getAppVersion() {
return Version.getVersion();
}
private final CTCloudHttpClient httpClient = CTCloudHttpClient.getInstance();
public LicenseResponse getLicenseInfo(String licenseString) throws CTCloudException {
LicenseRequest licenseRequest = new LicenseRequest()
.setBoostLicenseCode(licenseString)
.setHostId(CTHostIDGenerationUtil.generateLicenseHostID())
.setProduct(AUTOPSY_PRODUCT)
.setTimeZoneId(UserPreferences.getInferredUserTimeZone());
return httpClient.doPost(LICENSE_REQUEST_PATH, licenseRequest, LicenseResponse.class);
}
public AuthTokenResponse getAuthToken(DecryptedLicenseResponse decrypted) throws CTCloudException {
return getAuthToken(decrypted, null);
}
public AuthTokenResponse getAuthToken(DecryptedLicenseResponse decrypted, Long fileUploadSize) throws CTCloudException {
AuthTokenRequest authTokenRequest = new AuthTokenRequest()
.setAutopsyVersion(getAppVersion())
.setRequestFileUpload(fileUploadSize != null && fileUploadSize > 0)
.setFileUploadSize(fileUploadSize != null && fileUploadSize > 0 ? fileUploadSize : null)
.setBoostLicenseId(decrypted.getBoostLicenseId())
.setHostId(decrypted.getLicenseHostId());
return httpClient.doPost(AUTH_TOKEN_REQUEST_PATH, authTokenRequest, AuthTokenResponse.class);
}
public void uploadFile(FileUploadRequest fileUploadRequest) throws CTCloudException {
httpClient.doFileUploadPut(fileUploadRequest);
}
public void uploadMeta(AuthenticatedRequestData authenticatedRequestData, MetadataUploadRequest metaRequest) throws CTCloudException {
httpClient.doPost(CTCLOUD_UPLOAD_FILE_METADATA_PATH, getAuthParams(authenticatedRequestData), metaRequest, null);
}
private static Map<String, String> getAuthParams(AuthenticatedRequestData authenticatedRequestData) {
return new HashMap<String, String>() {
{
put("api_key", authenticatedRequestData.getApiKey());
put("token", authenticatedRequestData.getToken());
put("host_id", authenticatedRequestData.getHostId());
}
};
}
public List<CTCloudBean> getReputationResults(AuthenticatedRequestData authenticatedRequestData, List<String> md5Hashes) throws CTCloudException {
if (CollectionUtils.isEmpty(md5Hashes)) {
return Collections.emptyList();
}
FileReputationRequest fileRepReq = new FileReputationRequest()
.setHashes(md5Hashes);
CTCloudBeanResponse resp = httpClient.doPost(
CTCLOUD_SERVER_HASH_PATH,
getAuthParams(authenticatedRequestData),
fileRepReq,
CTCloudBeanResponse.class
);
return resp == null || resp.getItems() == null
? Collections.emptyList()
: resp.getItems();
}
}

View File

@ -0,0 +1,99 @@
/*
* 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;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
/**
* An exception thrown due to an error that occurs while making a CT Cloud REST
* API request.
*/
public class CTCloudException extends Exception{
private final ErrorCode errorCode;
public enum ErrorCode {
BAD_REQUEST("CT-400", "Unknown or Bad request. Please contact Basis support at " + Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM + " for help diagnosing the problem."),
INVALID_KEY("CT-401", "An invalid license ID was used to access CyberTriage Cloud Service. Please contact Basis support " + Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM + " for help diagnosing the problem."),
GATEWAY_TIMEOUT("CT-504", "Request to CyberTriage Cloud Service timed out. Please retry after some time. If issue persists, please contact Basis support at " + Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM + " for assistance."),
UN_AUTHORIZED("CT-403", "An authorization error occurred. Please contact Basis support " + Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM + " for help diagnosing the problem."),
PROXY_UNAUTHORIZED("CT-407", "Proxy authentication failed. Please validate the connection settings from the Options panel Proxy Settings."),
TEMP_UNAVAILABLE("CT-500", "CyberTriage Cloud Service temporarily unavailable; please try again later. If this problem persists, contact Basis support at " + Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM),
UNKNOWN("CT-080", "Unknown error while communicating with CyberTriage Cloud Service. If this problem persists, contact Basis support at "+ Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM +" for assistance."),
UNKNOWN_HOST("CT-081", "Unknown host error. If this problem persists, contact Basis support at "+ Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM +" for assistance."),
NETWORK_ERROR("CT-015", "Error connecting to CyberTriage Cloud.\n"
+ "Check your firewall or proxy settings.\n"
+ "Contact Support (support@cybertriage.com) for further assistance");
private final String errorcode;
private final String description;
private ErrorCode(String errorcode, String description) {
this.errorcode = errorcode;
this.description = description;
}
public String getCode() {
return errorcode;
}
public String getDescription() {
return description;
}
}
public CTCloudException(CTCloudException.ErrorCode errorCode) {
super(errorCode.name());
this.errorCode = errorCode;
}
public CTCloudException(CTCloudException.ErrorCode errorCode, Throwable throwable) {
super(errorCode.name(), throwable);
this.errorCode = errorCode;
}
public ErrorCode getErrorCode() {
return errorCode;
}
public String getErrorDetails() {
if(getErrorCode() == CTCloudException.ErrorCode.UNKNOWN && Objects.nonNull(getCause())){
return String.format("An API error %s occurred. Please try again, and contact Basis support at %s for help if the problem persists.",
StringUtils.isNotBlank(getCause().getLocalizedMessage()) ? "("+getCause().getLocalizedMessage()+")": "(Unknown)",
Constants.SUPPORT_AT_CYBERTRIAGE_DOT_COM );
}else {
return getErrorCode().getDescription();
}
}
/*
* Attempts to find a more specific error code than "Unknown" for the given exception.
*/
public static ErrorCode parseUnknownException(Throwable throwable) {
String stackTrace = ExceptionUtils.getStackTrace(throwable);
if (stackTrace.contains("UnknownHostException")) {
return ErrorCode.UNKNOWN_HOST;
}
return ErrorCode.UNKNOWN;
}
}

View File

@ -0,0 +1,436 @@
/*
* 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;
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.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.InputStream;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.stream.Stream;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.StringEntity;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.WinHttpClients;
import org.apache.http.impl.conn.SystemDefaultRoutePlanner;
import org.apache.http.ssl.SSLInitializationException;
import org.netbeans.core.ProxySettings;
import org.openide.util.Lookup;
import org.sleuthkit.autopsy.coreutils.Version;
/**
* Makes the http requests to CT cloud.
*
* NOTE: regarding proxy settings, the host and port are handled by the
* NbProxySelector. Any proxy authentication is handled by NbAuthenticator which
* is installed at startup (i.e. NbAuthenticator.install). See
* GeneralOptionsModel.testHttpConnection to see how the general options panel
* tests the connection.
*/
class CTCloudHttpClient {
private static final Logger LOGGER = Logger.getLogger(CTCloudHttpClient.class.getName());
private static final String HOST_URL = Version.getBuildType() == Version.Type.RELEASE ? Constants.CT_CLOUD_SERVER : Constants.CT_CLOUD_DEV_SERVER;
private static final String NB_PROXY_SELECTOR_NAME = "org.netbeans.core.NbProxySelector";
private static final int CONNECTION_TIMEOUT_MS = 58 * 1000; // milli sec
private static final CTCloudHttpClient instance = new CTCloudHttpClient();
public static CTCloudHttpClient getInstance() {
return instance;
}
private final ObjectMapper mapper = ObjectMapperUtil.getInstance().getDefaultObjectMapper();
private final SSLContext sslContext;
private final ProxySelector proxySelector;
private CTCloudHttpClient() {
// leave as null for now unless we want to customize this at a later date
this.sslContext = createSSLContext();
this.proxySelector = getProxySelector();
}
private static URI getUri(String host, String path, Map<String, String> urlReqParams) throws URISyntaxException {
String url = host + path;
URIBuilder builder = new URIBuilder(url);
if (!MapUtils.isEmpty(urlReqParams)) {
for (Entry<String, String> e : urlReqParams.entrySet()) {
String key = e.getKey();
String value = e.getValue();
if (StringUtils.isNotBlank(key) || StringUtils.isNotBlank(value)) {
builder.addParameter(key, value);
}
}
}
return builder.build();
}
public <O> O doPost(String urlPath, Object jsonBody, Class<O> classType) throws CTCloudException {
return doPost(urlPath, Collections.emptyMap(), jsonBody, classType);
}
public <O> O doPost(String urlPath, Map<String, String> urlReqParams, Object jsonBody, Class<O> classType) throws CTCloudException {
URI postURI = null;
try {
postURI = getUri(HOST_URL, urlPath, urlReqParams);
LOGGER.log(Level.INFO, "initiating http connection to ctcloud server");
try (CloseableHttpClient httpclient = createConnection(proxySelector, sslContext)) {
HttpPost postRequest = new HttpPost(postURI);
configureRequestTimeout(postRequest);
postRequest.setHeader("Content-type", "application/json");
if (jsonBody != null) {
String requestBody = mapper.writeValueAsString(jsonBody);
if (StringUtils.isNotBlank(requestBody)) {
HttpEntity entity = new StringEntity(requestBody, "UTF-8");
postRequest.setEntity(entity);
}
}
LOGGER.log(Level.INFO, "initiating http post request to ctcloud server " + postRequest.getURI());
try (CloseableHttpResponse response = httpclient.execute(postRequest)) {
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
LOGGER.log(Level.INFO, "Response Received. - Status OK");
// Parse Response
if (classType != null) {
HttpEntity entity = response.getEntity();
String entityStr = EntityUtils.toString(entity);
O respObj = mapper.readValue(entityStr, classType);
return respObj;
} else {
return null;
}
} else {
LOGGER.log(Level.WARNING, "Response Received. - Status Error {}", response.getStatusLine());
handleNonOKResponse(response, "");
}
} catch (Exception ex) {
LOGGER.log(Level.WARNING, "Error when parsing response from CyberTriage Cloud", ex);
throw new CTCloudException(CTCloudException.parseUnknownException(ex), ex);
}
}
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "IO Exception raised when connecting to CT Cloud using " + postURI, ex);
throw new CTCloudException(CTCloudException.ErrorCode.NETWORK_ERROR, ex);
} catch (SSLInitializationException ex) {
LOGGER.log(Level.WARNING, "No such algorithm exception raised when creating SSL connection for CT Cloud using " + postURI, ex);
throw new CTCloudException(CTCloudException.ErrorCode.NETWORK_ERROR, ex);
} catch (URISyntaxException ex) {
LOGGER.log(Level.WARNING, "Wrong URL syntax for CT Cloud " + postURI, ex);
throw new CTCloudException(CTCloudException.ErrorCode.UNKNOWN, ex);
}
return null;
}
public void doFileUploadPut(FileUploadRequest fileUploadRequest) throws CTCloudException {
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 {
putUri = new URI(fullUrlPath);
} catch (URISyntaxException ex) {
LOGGER.log(Level.WARNING, "Wrong URL syntax for CT Cloud " + fullUrlPath, ex);
throw new CTCloudException(CTCloudException.ErrorCode.UNKNOWN, ex);
}
try (CloseableHttpClient httpclient = createConnection(proxySelector, sslContext)) {
LOGGER.log(Level.INFO, "initiating http post request to ctcloud server " + fullUrlPath);
HttpPut put = new HttpPut(putUri);
configureRequestTimeout(put);
put.addHeader("Connection", "keep-alive");
put.setEntity(new InputStreamEntity(fileInputStream, contentLength, ContentType.APPLICATION_OCTET_STREAM));
try (CloseableHttpResponse response = httpclient.execute(put)) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_NO_CONTENT) {
LOGGER.log(Level.INFO, "Response Received. - Status OK");
} else {
LOGGER.log(Level.WARNING, MessageFormat.format("Response Received. - Status Error {0}", response.getStatusLine()));
handleNonOKResponse(response, fileName);
}
}
} catch (SSLInitializationException ex) {
LOGGER.log(Level.WARNING, "SSL exception raised when connecting to Reversing Labs for file content upload ", ex);
throw new CTCloudException(CTCloudException.ErrorCode.NETWORK_ERROR, ex);
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "IO Exception raised when connecting to Reversing Labs for file content upload ", ex);
throw new CTCloudException(CTCloudException.ErrorCode.NETWORK_ERROR, ex);
}
}
/**
* A generic way to handle the HTTP response - when the response code is NOT
* 200 OK.
*
* @param response
* @param fileName - used only for logging.
* @throws MalwareScannerException
* @throws IOException
*/
private void handleNonOKResponse(CloseableHttpResponse response, String fileName) throws CTCloudException, IOException {
LOGGER.log(Level.WARNING, MessageFormat.format(
"Response code {0}. Message Body {1}",
response.getStatusLine().getStatusCode(),
EntityUtils.toString(response.getEntity())));
switch (response.getStatusLine().getStatusCode()) {
case HttpStatus.SC_BAD_REQUEST:
//400: Bad request => Unsupported HTTP method or invalid http request (e.g., empty body).
throw new CTCloudException(CTCloudException.ErrorCode.BAD_REQUEST);
case HttpStatus.SC_UNAUTHORIZED:
//401 Invalid API key => An invalid API key, or no API key, has been provided
throw new CTCloudException(CTCloudException.ErrorCode.INVALID_KEY);
case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
// 407 Proxy server authentication required.
throw new CTCloudException(CTCloudException.ErrorCode.PROXY_UNAUTHORIZED);
case HttpStatus.SC_FORBIDDEN:
throw new CTCloudException(CTCloudException.ErrorCode.UN_AUTHORIZED);
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
//500 Internal error Server temporarily unavailable; please try again later. If the issue persists, please contact RL.
throw new CTCloudException(CTCloudException.ErrorCode.TEMP_UNAVAILABLE);
case HttpStatus.SC_SERVICE_UNAVAILABLE:
//503 Server is too busy. Try again later.
//503 Failed to request scan. Try again later. The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. If the issue persists, please contact RL.
throw new CTCloudException(CTCloudException.ErrorCode.TEMP_UNAVAILABLE);
case HttpStatus.SC_GATEWAY_TIMEOUT:
throw new CTCloudException(CTCloudException.ErrorCode.GATEWAY_TIMEOUT);
default:
String returnData = EntityUtils.toString(response.getEntity());
LOGGER.log(Level.WARNING, MessageFormat.format("upload response content for {0}:\n {1}", fileName, returnData));
throw new CTCloudException(CTCloudException.ErrorCode.NETWORK_ERROR);
}
}
/**
* NOTE That this is not a perfect solution as timeouts set this way does
* not terminate a connection forcefully after a specified interval. so if
* there is data streaming in from the server at a small speed the
* connection will be kept open.
*
* @param request
*/
private void configureRequestTimeout(HttpRequestBase request) {
RequestConfig config = RequestConfig.custom()
.setConnectionRequestTimeout(CONNECTION_TIMEOUT_MS)
.setConnectTimeout(CONNECTION_TIMEOUT_MS)
.setSocketTimeout(CONNECTION_TIMEOUT_MS)
.build();
request.setConfig(config);
}
/**
* Get ProxySelector present (favoring NbProxySelector if present).
*
* @return The found ProxySelector or null.
*/
private static ProxySelector getProxySelector() {
Collection<? extends ProxySelector> selectors = Lookup.getDefault().lookupAll(ProxySelector.class);
return (selectors != null ? selectors.stream() : Stream.empty())
.filter(s -> s != null)
.map(s -> (ProxySelector) s)
.sorted((a, b) -> {
String aName = a.getClass().getCanonicalName();
String bName = b.getClass().getCanonicalName();
boolean aIsNb = aName.equalsIgnoreCase(NB_PROXY_SELECTOR_NAME);
boolean bIsNb = bName.equalsIgnoreCase(NB_PROXY_SELECTOR_NAME);
if (aIsNb == bIsNb) {
return StringUtils.compareIgnoreCase(aName, bName);
} else {
return aIsNb ? -1 : 1;
}
})
.findFirst()
// TODO take this out to remove proxy selector logging
.map(s -> new LoggingProxySelector(s))
.orElse(null);
}
/**
* Create an SSLContext object using our in-memory keystore.
*
* @return
*/
private static SSLContext createSSLContext() {
LOGGER.log(Level.INFO, "Creating custom SSL context");
try {
// I'm not sure how much of this is really necessary to set up, but it works
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
KeyManager[] keyManagers = getKeyManagers();
TrustManager[] trustManagers = getTrustManagers();
sslContext.init(keyManagers, trustManagers, new SecureRandom());
return sslContext;
} catch (NoSuchAlgorithmException | KeyManagementException ex) {
LOGGER.log(Level.SEVERE, "Error creating SSL context", ex);
return null;
}
}
// jvm default key manager
// based in part on this: https://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm/16229909
private static KeyManager[] getKeyManagers() {
LOGGER.log(Level.INFO, "Using default algorithm to create trust store: " + KeyManagerFactory.getDefaultAlgorithm());
try {
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(null, null);
return kmf.getKeyManagers();
} catch (NoSuchAlgorithmException | KeyStoreException | UnrecoverableKeyException ex) {
LOGGER.log(Level.SEVERE, "Error getting KeyManagers", ex);
return new KeyManager[0];
}
}
// jvm default trust store
// based in part on this: https://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm/16229909
private static TrustManager[] getTrustManagers() {
try {
LOGGER.log(Level.INFO, "Using default algorithm to create trust store: " + TrustManagerFactory.getDefaultAlgorithm());
TrustManagerFactory tmf
= TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
X509TrustManager tm = (X509TrustManager) tmf.getTrustManagers()[0];
return new TrustManager[]{tm};
} catch (KeyStoreException | NoSuchAlgorithmException ex) {
LOGGER.log(Level.SEVERE, "Error getting TrustManager", ex);
return new TrustManager[0];
}
}
/**
* Creates a connection to CT Cloud with the given arguments.
*
* @param proxySelector The proxy selector.
* @param sslContext The ssl context or null.
* @return The connection to CT Cloud.
*/
private static CloseableHttpClient createConnection(ProxySelector proxySelector, SSLContext sslContext) throws SSLInitializationException {
HttpClientBuilder builder;
if (ProxySettings.getProxyType() != ProxySettings.DIRECT_CONNECTION
&& StringUtils.isBlank(ProxySettings.getAuthenticationUsername())
&& ArrayUtils.isEmpty(ProxySettings.getAuthenticationPassword())
&& WinHttpClients.isWinAuthAvailable()) {
builder = WinHttpClients.custom();
builder.useSystemProperties();
LOGGER.log(Level.WARNING, "Using Win HTTP Client");
} else {
builder = HttpClients.custom();
// builder.setDefaultRequestConfig(config);
LOGGER.log(Level.WARNING, "Using default http client");
}
if (sslContext != null) {
builder.setSSLContext(sslContext);
}
if (proxySelector != null) {
builder.setRoutePlanner(new SystemDefaultRoutePlanner(proxySelector));
}
return builder.build();
}
private static class LoggingProxySelector extends ProxySelector {
private final ProxySelector delegate;
public LoggingProxySelector(ProxySelector delegate) {
this.delegate = delegate;
}
@Override
public List<Proxy> select(URI uri) {
List<Proxy> selectedProxies = delegate.select(uri);
LOGGER.log(Level.INFO, MessageFormat.format("Proxy selected for {0} are {1}", uri, selectedProxies));
return selectedProxies;
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
LOGGER.log(Level.WARNING, MessageFormat.format("Connection failed connecting to {0} socket address {1}", uri, sa), ioe);
delegate.connectFailed(uri, sa, ioe);
}
}
}

View File

@ -0,0 +1,87 @@
/*
* 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;
import java.net.URI;
/**
* Constants regarding connections to cyber triage cloud.
*/
final class Constants {
public static final String CYBER_TRIAGE = "CyberTriage";
public static final String IS_MEMORY_IMAGE = "IS_MEMORY_IMAGE";
public static final String SSLTEST_URL = "https://www2.cybertriage.com/ssl_test.html";
public static final String CT_CLOUD_DEV_SERVER = "https://cyber-triage-dev.appspot.com";
public static final String CT_CLOUD_SERVER = "https://rep1.cybertriage.com";
/**
* Link to watch demo video
* @since 3.1.0
*/
public static final String DEMO_VIDEO_URL = "https://www.cybertriage.com/video/cyber-triage-demo-video/?utm_source=Cyber+Triage+Tool&utm_campaign=Eval+Demo+Video";
/**
* Link request quote
* @since 3.1.0
*/
public static final String REQUEST_QUOTE_URL = "https://www.cybertriage.com/request-quote/?utm_source=Cyber+Triage+Tool&utm_campaign=Eval+Quote";
/**
* Latest help document URL
* @since 3.2.0
*/
public static final URI USER_GUIDE_LATEST_URL = URI.create("https://docs.cybertriage.com/en/latest/?utm_source=Cyber+Triage+Tool&utm_campaign=Help+Docs");
/**
* Visit website URL
* @since 3.1.0
*/
public static final String VISIT_WEBSITE_URL ="https://www.cybertriage.com/eval_data_202109/?utm_source=Cyber+Triage+Tool&utm_campaign=Eval+Data+Button";
/**
* URL for visiting the website after the data is ingested on the dashboard.
*/
public static final String EVAL_WEBSITE_AUTO_URL = "https://www.cybertriage.com/eval_data_202109_auto/?utm_source=Cyber+Triage+Tool&utm_campaign=Eval+Data+Auto/"; //CT-4045
public static final String SUPPORT_AT_CYBERTRIAGE_DOT_COM = "support@cybertriage.com";
public static final String SALES_AT_CYBERTRIAGE_DOT_COM = "sales@cybertriage.com";
public final static String AUTODETECT = "Auto Detect";
public final static int RESTAPI_PORT = 9443;
public static final String INVALID_HOSTNAME_REQUEST = "Request rejected. Invalid host name. Hostname contains characters that are not allowed. \n"
+ "Characters that are not allowed include `~!@#$&^*(){}[]\\\\|;'\",<>/? \n"
+ "You may input the host IP address if the name is not resolving.";
public static final String INVALID_HOSTNAME_UI = "Invalid host name. Hostname contains characters that are not allowed. \n"
+ "Characters that are not allowed include `~!@#$&^*(){}[]\\\\|;'\",<>/?";
}

View File

@ -0,0 +1,89 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
/**
* POJO for an auth token request.
*/
public class AuthTokenRequest {
@JsonProperty("autopsy_version")
private String autopsyVersion;
@JsonProperty("boost_license_id")
private String boostLicenseId;
@JsonProperty("requestFileUpload")
private boolean requestFileUpload;
@JsonProperty("fileUploadSize")
private Long fileUploadSize;
@JsonProperty("host_id")
private String hostId;
public String getAutopsyVersion() {
return autopsyVersion;
}
public AuthTokenRequest setAutopsyVersion(String autopsyVersion) {
this.autopsyVersion = autopsyVersion;
return this;
}
public String getBoostLicenseId() {
return boostLicenseId;
}
public AuthTokenRequest setBoostLicenseId(String boostLicenseId) {
this.boostLicenseId = boostLicenseId;
return this;
}
public boolean isRequestFileUpload() {
return requestFileUpload;
}
public AuthTokenRequest setRequestFileUpload(boolean requestFileUpload) {
this.requestFileUpload = requestFileUpload;
return this;
}
public Long getFileUploadSize() {
return fileUploadSize;
}
public AuthTokenRequest setFileUploadSize(Long fileUploadSize) {
this.fileUploadSize = fileUploadSize;
return this;
}
public String getHostId() {
return hostId;
}
public AuthTokenRequest setHostId(String hostId) {
this.hostId = hostId;
return this;
}
}

View File

@ -0,0 +1,105 @@
/*
* 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 com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil.InstantEpochMillisDeserializer;
import com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil.InstantEpochSecsDeserializer;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.time.Instant;
/**
* POJO for an auth token response.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthTokenResponse {
private final Long hashLookupCount;
private final Long hashLookupLimit;
private final Long fileUploadLimit;
private final Long fileUploadCount;
private final String fileUploadUrl;
private final Instant expiration;
private final String token;
private final String apiKey;
private final Instant resetDate;
@JsonCreator
public AuthTokenResponse(
@JsonProperty("token") String token,
@JsonProperty("api_key") String apiKey,
@JsonProperty("hashLookupCount") Long hashLookupCount,
@JsonProperty("hashLookupLimit") Long hashLookupLimit,
@JsonProperty("fileUploadLimit") Long fileUploadLimit,
@JsonProperty("fileUploadCount") Long fileUploadCount,
@JsonProperty("fileUploadUrl") String fileUploadUrl,
@JsonDeserialize(using = InstantEpochSecsDeserializer.class)
@JsonProperty("expiration") Instant expiration,
@JsonDeserialize(using = InstantEpochMillisDeserializer.class)
@JsonProperty("resetDate") Instant resetDate
) {
this.token = token;
this.apiKey = apiKey;
this.hashLookupCount = hashLookupCount;
this.hashLookupLimit = hashLookupLimit;
this.fileUploadLimit = fileUploadLimit;
this.fileUploadCount = fileUploadCount;
this.fileUploadUrl = fileUploadUrl;
this.expiration = expiration;
this.resetDate = resetDate;
}
public Long getHashLookupCount() {
return hashLookupCount;
}
public Long getHashLookupLimit() {
return hashLookupLimit;
}
public Long getFileUploadLimit() {
return fileUploadLimit;
}
public Long getFileUploadCount() {
return fileUploadCount;
}
public String getFileUploadUrl() {
return fileUploadUrl;
}
public Instant getExpiration() {
return expiration;
}
public String getToken() {
return token;
}
public String getApiKey() {
return apiKey;
}
public Instant getResetDate() {
return resetDate;
}
}

View File

@ -0,0 +1,52 @@
/*
* 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;
/**
* Data required for an authenticated request.
*/
public class AuthenticatedRequestData {
private final String token;
private final String apiKey;
private final String hostId;
public AuthenticatedRequestData(DecryptedLicenseResponse decrypted, AuthTokenResponse authResp) {
this(authResp.getToken(), authResp.getApiKey(), decrypted.getLicenseHostId());
}
public AuthenticatedRequestData(String token, String apiKey, String hostId) {
this.token = token;
this.apiKey = apiKey;
this.hostId = hostId;
}
public String getToken() {
return token;
}
public String getApiKey() {
return apiKey;
}
public String getHostId() {
return hostId;
}
}

View File

@ -0,0 +1,66 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* POJO for a boost license response object that is a part of the license
* response.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class BoostLicenseResponse {
private final String version;
private final String iv;
private final String encryptedKey;
private final String encryptedJson;
@JsonCreator
public BoostLicenseResponse(
@JsonProperty("version") String version,
@JsonProperty("iv") String iv,
@JsonProperty("encryptedKey") String encryptedKey,
@JsonProperty("encryptedJson") String encryptedJson) {
this.version = version;
this.iv = iv;
this.encryptedKey = encryptedKey;
this.encryptedJson = encryptedJson;
}
public String getVersion() {
return version;
}
public String getIv() {
return iv;
}
public String getEncryptedKey() {
return encryptedKey;
}
public String getEncryptedJson() {
return encryptedJson;
}
}

View File

@ -0,0 +1,103 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
*
* @author rishwanth
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class CTCloudBean {
public static enum Status {
FOUND,
NOT_FOUND,
ERROR,
LIMITS_EXCEEDED,
BEING_SCANNED;
}
@Nonnull
@JsonProperty("malware")
private MalwareResultBean malwareResult;
@JsonProperty("correlation")
private CorrelationResultBean correlationResult;
@Nonnull
@JsonProperty("md5_hash")
private String md5HashValue;
@Nullable
@JsonProperty("sha1_hash")
private String sha1HashValue;
public String getMd5HashValue() {
return md5HashValue;
}
public String getSha1HashValue() {
return sha1HashValue;
}
public void setMd5HashValue(String md5HashValue) {
this.md5HashValue = md5HashValue;
}
public void setSha1HashValue(String sha1HashValue) {
this.sha1HashValue = sha1HashValue;
}
public MalwareResultBean getMalwareResult() {
return malwareResult;
}
public void setMalwareResult(MalwareResultBean malwareResult) {
this.malwareResult = malwareResult;
}
public CorrelationResultBean getCorrelationResult() {
return correlationResult;
}
public void setCorrelationResult(CorrelationResultBean correlationResult) {
this.correlationResult = correlationResult;
}
@Override
public String toString() {
return "CTCloudBean{"
+ "status=" + malwareResult.getStatus()
+ ", malwareDescription=" + malwareResult.getMalwareDescription()
+ ", score=" + malwareResult.getCTScore()
+ ", md5HashValue=" + md5HashValue
+ ", sha1HashValue=" + sha1HashValue
+ ", firstSeen=" + malwareResult.getFirstAnalyzedDate()
+ ", lastSeen=" + malwareResult.getLastAnalyzedDate()
+ ", statusDescription=" + malwareResult.getStatusDescription()
+ ", metadata=" + malwareResult.getMetadata()
+ '}';
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
/**
* Container for file reputation result list response.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class CTCloudBeanResponse {
private final List<CTCloudBean> items;
@JsonCreator
public CTCloudBeanResponse(
@JsonProperty("items") List<CTCloudBean> items
) {
this.items = items;
}
public List<CTCloudBean> getItems() {
return items;
}
}

View File

@ -0,0 +1,58 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.annotation.Nonnull;
@JsonIgnoreProperties(ignoreUnknown = true)
public class CTCloudCorrelationResultBean {
@JsonProperty("correlation")
private CorrelationResultBean correlationResult;
@Nonnull
@JsonProperty("signature")
private String signature;
public CorrelationResultBean getCorrelationResult() {
return correlationResult;
}
public void setCorrelationResult(CorrelationResultBean correlationResult) {
this.correlationResult = correlationResult;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
@Override
public String toString() {
return "CTCloudCorrelationResultBean{"
+ "correlationResult=" + correlationResult
+ ", signature=" + signature
+ '}';
}
}

View File

@ -0,0 +1,46 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
/**
*
* @author rishwanth
*/
class CTCloudCostBean {
private final String provider;
private final Integer units;
public CTCloudCostBean(@JsonProperty("provider") String provider, @JsonProperty("units") Integer units) {
this.provider = provider;
this.units = units;
}
public String getProvider() {
return provider;
}
public Integer getUnits() {
return units;
}
}

View File

@ -0,0 +1,82 @@
/*
* 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 com.google.common.base.MoreObjects;
import static com.google.common.base.Preconditions.checkArgument;
import org.sleuthkit.datamodel.Score;
import org.sleuthkit.datamodel.Score.Priority;
import org.sleuthkit.datamodel.Score.Significance;
/**
*
* Score class represents a conclusion and the relative confidence in the conclusion about
* a subject. A subject may be an Item, a category/analysis result etc.
* @since 1.7.0
*
*/
public enum CTScore {
/*
Enum names without method defaults to AUTO
NOTABLE -> NOTABLE
*/
// Unknown None
UNKNOWN(new Score(Significance.UNKNOWN, Priority.NORMAL)),
// GOOD_MEDIUM
LIKELY_NONE(new Score(Significance.LIKELY_NONE, Priority.NORMAL)),
// SUSPICIOUS_HIGH / BAD_MEDIUM
LIKELY_NOTABLE(new Score(Significance.LIKELY_NOTABLE, Priority.NORMAL)),
// GOOD_HIGH
NONE(new Score(Significance.NONE, Priority.NORMAL)),
// BAD_HIGH
NOTABLE(new Score(Significance.NOTABLE, Priority.NORMAL)),
// SUSPICIOUS (User flagged)
LIKELY_NOTABLE_MANUAL(new Score(Significance.LIKELY_NOTABLE, Priority.OVERRIDE)),
// Good (User flagged)
NONE_MANUAL(new Score(Significance.NONE, Priority.OVERRIDE)),
// Bad (User flagged)
NOTABLE_MANUAL(new Score(Significance.NOTABLE, Priority.OVERRIDE));
private final Score tskScore;
/**
* Create a CTScore instance based on score
* @param tskScore
*/
private CTScore(Score tskScore) {
checkArgument(tskScore.getSignificance() == Significance.UNKNOWN ? tskScore.getPriority() == Priority.NORMAL : true, "Unknown Conclusions expects no (NORMAL) priority");
this.tskScore = tskScore;
}
public Score getTskCore() {
return tskScore;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("Method Category", tskScore.getPriority())
.add("Significance", tskScore.getSignificance()).toString();
}
}

View File

@ -0,0 +1,29 @@
/*
* 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;
/**
*
* @author rishwanth
*/
public enum CorrelationFrequency {
UNIQUE,
RARE,
COMMON;
}

View File

@ -0,0 +1,51 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
/**
*
* @author rishwanth
*/
public class CorrelationResultBean {
@JsonProperty("frequency")
private CorrelationFrequency frequency;
@JsonProperty("frequency_description")
private String frequencyDescription;
public CorrelationFrequency getFrequency() {
return frequency;
}
public String getFrequencyDescription() {
return frequencyDescription;
}
public void setFrequency(CorrelationFrequency frequency) {
this.frequency = frequency;
}
public void setFrequencyDescription(String frequencyDescription) {
this.frequencyDescription = frequencyDescription;
}
}

View File

@ -0,0 +1,118 @@
/*
* 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 com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil.InstantEpochMillisDeserializer;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.time.Instant;
/**
* POJO for after encrypted boost license has been decrypted.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class DecryptedLicenseResponse {
private final String boostLicenseId;
private final String licenseHostId;
private final Instant expirationDate;
private final Long hashLookups;
private final Long fileUploads;
private final Instant activationTime;
private final String product;
private final LicenseLimitType limitType;
private final String timezone;
private final String customerEmail;
private final String customerName;
@JsonCreator
public DecryptedLicenseResponse(
@JsonProperty("boostLicenseId") String boostLicenseId,
@JsonProperty("licenseHostId") String licenseHostId,
@JsonDeserialize(using = InstantEpochMillisDeserializer.class)
@JsonProperty("expirationDate") Instant expirationDate,
@JsonProperty("hashLookups") Long hashLookups,
@JsonProperty("fileUploads") Long fileUploads,
@JsonDeserialize(using = InstantEpochMillisDeserializer.class)
@JsonProperty("activationTime") Instant activationTime,
@JsonProperty("product") String product,
@JsonProperty("limitType") LicenseLimitType limitType,
@JsonProperty("timezone") String timezone,
@JsonProperty("customerEmail") String customerEmail,
@JsonProperty("customerName") String customerName
) {
this.boostLicenseId = boostLicenseId;
this.licenseHostId = licenseHostId;
this.expirationDate = expirationDate;
this.hashLookups = hashLookups;
this.fileUploads = fileUploads;
this.activationTime = activationTime;
this.product = product;
this.limitType = limitType;
this.timezone = timezone;
this.customerEmail = customerEmail;
this.customerName = customerName;
}
public String getBoostLicenseId() {
return boostLicenseId;
}
public String getLicenseHostId() {
return licenseHostId;
}
public Long getHashLookups() {
return hashLookups;
}
public Long getFileUploads() {
return fileUploads;
}
public Instant getActivationTime() {
return activationTime;
}
public String getProduct() {
return product;
}
public LicenseLimitType getLimitType() {
return limitType;
}
public Instant getExpirationDate() {
return expirationDate;
}
public String getTimezone() {
return timezone;
}
public String getCustomerEmail() {
return customerEmail;
}
public String getCustomerName() {
return customerName;
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
/**
* Request for file reputation results.
*/
public class FileReputationRequest {
@JsonProperty("hashes")
private List<String> hashes;
public List<String> getHashes() {
return hashes;
}
public FileReputationRequest setHashes(List<String> hashes) {
this.hashes = hashes;
return this;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,40 @@
/*
* 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;
/**
* Contains license info and decrypted boost license.
*/
public class LicenseInfo {
private final LicenseResponse licenseResponse;
private final DecryptedLicenseResponse decryptedLicense;
public LicenseInfo(LicenseResponse licenseResponse, DecryptedLicenseResponse decryptedLicense) {
this.licenseResponse = licenseResponse;
this.decryptedLicense = decryptedLicense;
}
public LicenseResponse getLicenseResponse() {
return licenseResponse;
}
public DecryptedLicenseResponse getDecryptedLicense() {
return decryptedLicense;
}
}

View File

@ -0,0 +1,30 @@
/*
* 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;
/**
* The limit type (and reset) for the license.
*/
public enum LicenseLimitType {
HOURLY,
DAILY,
WEEKLY,
MONTHLY,
NO_RESET;
}

View File

@ -0,0 +1,77 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
/**
* POJO for license request information.
*/
public class LicenseRequest {
@JsonProperty("host_id")
private String hostId;
@JsonProperty("boost_license_code")
private String boostLicenseCode;
@JsonProperty("product")
private String product;
@JsonProperty("time_zone_id")
private String timeZoneId;
public String getHostId() {
return hostId;
}
public LicenseRequest setHostId(String hostId) {
this.hostId = hostId;
return this;
}
public String getBoostLicenseCode() {
return boostLicenseCode;
}
public LicenseRequest setBoostLicenseCode(String boostLicenseCode) {
this.boostLicenseCode = boostLicenseCode;
return this;
}
public String getProduct() {
return product;
}
public LicenseRequest setProduct(String product) {
this.product = product;
return this;
}
public String getTimeZoneId() {
return timeZoneId;
}
public LicenseRequest setTimeZoneId(String timeZoneId) {
this.timeZoneId = timeZoneId;
return this;
}
}

View File

@ -0,0 +1,64 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* Response POJO for request for license.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class LicenseResponse {
private final Boolean success;
private final Boolean hostChanged;
private final Long hostChangesRemaining;
private final BoostLicenseResponse boostLicense;
@JsonCreator
public LicenseResponse(
@JsonProperty("success") Boolean success,
@JsonProperty("hostChanged") Boolean hostChanged,
@JsonProperty("hostChangesRemaining") Long hostChangesRemaining,
@JsonProperty("boostLicense") BoostLicenseResponse boostLicense
) {
this.success = success;
this.hostChanged = hostChanged;
this.hostChangesRemaining = hostChangesRemaining;
this.boostLicense = boostLicense;
}
public Boolean isSuccess() {
return success;
}
public Boolean isHostChanged() {
return hostChanged;
}
public Long getHostChangesRemaining() {
return hostChangesRemaining;
}
public BoostLicenseResponse getBoostLicense() {
return boostLicense;
}
}

View File

@ -0,0 +1,170 @@
/*
* 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 com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil.ZonedDateTimeDeserializer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.time.ZonedDateTime;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
*
* @author rishwanth
*/
public class MalwareResultBean {
public static enum Status {
FOUND,
NOT_FOUND,
ERROR,
LIMITS_EXCEEDED,
BEING_SCANNED;
}
@Nullable
@JsonProperty("malware_description")
private String malwareDescription;
@Nonnull
@JsonProperty("status")
private Status status;
@Nonnull
@JsonProperty("score")
private String score;
private CTScore ctScore;
@Nullable
@JsonProperty("first_scan_date")
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private ZonedDateTime firstAnalyzedDate;
@Nullable
@JsonProperty("last_scan_date")
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private ZonedDateTime lastAnalyzedDate;
@JsonProperty("metadata")
private List<MetadataLabel> metadata;
@Nullable
@JsonProperty("status_description")
private String statusDescription;
@Nullable
@JsonProperty
private List<CTCloudCostBean> cost;
@JsonIgnore
public CTScore getCTScore() {
return ctScore;
}
public String getScore() {
return score;
}
public ZonedDateTime getFirstAnalyzedDate() {
return firstAnalyzedDate;
}
public ZonedDateTime getLastAnalyzedDate() {
return lastAnalyzedDate;
}
public List<MetadataLabel> getMetadata() {
if (metadata != null) {
return List.copyOf(metadata);
} else {
return List.of(); // empty list
}
}
public Status getStatus() {
return status;
}
public String getStatusDescription() {
return statusDescription;
}
public String getMalwareDescription() {
return malwareDescription;
}
public void setMalwareDescription(String malwareDescription) {
this.malwareDescription = malwareDescription;
}
public void setStatus(Status status) {
this.status = status;
}
public void setScore(String score) {
this.score = score;
switch(score) {
case "GOOD_HIGH":
this.ctScore = CTScore.NONE;
break;
case "GOOD_MEDIUM":
this.ctScore = CTScore.LIKELY_NONE;
break;
case "BAD_HIGH":
this.ctScore = CTScore.NOTABLE;
break;
case "BAD_MEDIUM":
this.ctScore = CTScore.LIKELY_NOTABLE;
break;
default:
this.ctScore = CTScore.UNKNOWN;
break;
}
}
public void setFirstAnalyzedDate(ZonedDateTime firstAnalyzedDate) {
this.firstAnalyzedDate = firstAnalyzedDate;
}
public void setLastAnalyzedDate(ZonedDateTime lastAnalyzedDate) {
this.lastAnalyzedDate = lastAnalyzedDate;
}
public void setMetadata(List<MetadataLabel> metadata) {
this.metadata = List.copyOf(metadata);
}
public void setStatusDescription(String statusDescription) {
this.statusDescription = statusDescription;
}
public List<CTCloudCostBean> getCost() {
return List.copyOf(cost);
}
public void setCost(List<CTCloudCostBean> cost) {
this.cost = List.copyOf(cost);
}
}

View File

@ -0,0 +1,58 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* Metadata entry.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class MetadataLabel {
private final String key;
private final String value;
private final String extendedInfo;
@JsonCreator
public MetadataLabel(
@JsonProperty("key") String key,
@JsonProperty("value") String value,
@JsonProperty("info") String extendedInfo
) {
this.key = key;
this.value = value;
this.extendedInfo = extendedInfo;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public String getExtendedInfo() {
return extendedInfo;
}
}

View File

@ -0,0 +1,109 @@
/*
* 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 com.fasterxml.jackson.annotation.JsonProperty;
public class MetadataUploadRequest {
@JsonProperty("file_upload_url")
private String fileUploadUrl;
@JsonProperty("sha1")
private String sha1;
@JsonProperty("sha256")
private String sha256;
@JsonProperty("md5")
private String md5;
@JsonProperty("filePath")
private String filePath;
@JsonProperty("fileSize")
private Long fileSizeBytes;
@JsonProperty("createdDate")
private Long createdDate;
public String getFileUploadUrl() {
return fileUploadUrl;
}
public MetadataUploadRequest setFileUploadUrl(String fileUploadUrl) {
this.fileUploadUrl = fileUploadUrl;
return this;
}
public String getSha1() {
return sha1;
}
public MetadataUploadRequest setSha1(String sha1) {
this.sha1 = sha1;
return this;
}
public String getSha256() {
return sha256;
}
public MetadataUploadRequest setSha256(String sha256) {
this.sha256 = sha256;
return this;
}
public String getMd5() {
return md5;
}
public MetadataUploadRequest setMd5(String md5) {
this.md5 = md5;
return this;
}
public String getFilePath() {
return filePath;
}
public MetadataUploadRequest setFilePath(String filePath) {
this.filePath = filePath;
return this;
}
public Long getFileSizeBytes() {
return fileSizeBytes;
}
public MetadataUploadRequest setFileSizeBytes(Long fileSizeBytes) {
this.fileSizeBytes = fileSizeBytes;
return this;
}
public Long getCreatedDate() {
return createdDate;
}
public MetadataUploadRequest setCreatedDate(Long createdDate) {
this.createdDate = createdDate;
return this;
}
}

View File

@ -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.util;
import com.license4j.HardwareID;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import org.apache.commons.lang3.StringUtils;
import org.sleuthkit.autopsy.coreutils.Logger;
/**
* Utility class to generate license hostID and Target hostID for malware scan
*
* @author rishwanth
*/
public class CTHostIDGenerationUtil {
private static final Logger LOGGER = Logger.getLogger(CTHostIDGenerationUtil.class.getName());
private static final String USER_NAME = System.getProperty("user.name");
private static String cachedId = "";
/**
* Host ID Algorithm: Get MAC address from License4J. Get MD5 hash of it and
* grab the first 16 characters of the hash. Get user name that Cyber Triage
* is running as. MD5 hash of user name. Grab first 16 characters.
* Concatenate them and separate with underscore. Example:
* c84f70d1baf96420_7d7519bf21602c24
*
* @return
*/
public static String generateLicenseHostID() {
if (StringUtils.isBlank(cachedId)) {
try {
String hostName = StringUtils.defaultString(InetAddress.getLocalHost().getCanonicalHostName());
String macAddressMd5 = StringUtils.isNotBlank(HardwareID.getHardwareIDFromEthernetAddress())
? Md5HashUtil.getMD5MessageDigest(HardwareID.getHardwareIDFromEthernetAddress()).substring(0, 16)
: Md5HashUtil.getMD5MessageDigest(hostName).substring(0, 16);
String usernameMd5 = StringUtils.isNotBlank(USER_NAME)
? Md5HashUtil.getMD5MessageDigest(USER_NAME).substring(0, 16)
: Md5HashUtil.getMD5MessageDigest(hostName).substring(0, 16);
cachedId = macAddressMd5 + "_" + usernameMd5;
} catch (UnknownHostException ex) {
LOGGER.log(Level.WARNING, "Unable to determine host name.", ex);
}
}
return cachedId;
}
}

View File

@ -0,0 +1,177 @@
/*
* 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.util;
import com.basistech.df.cybertriage.autopsy.ctapi.json.BoostLicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.json.DecryptedLicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* Decrypts the payload of boost license.
*/
public class LicenseDecryptorUtil {
private static final LicenseDecryptorUtil instance = new LicenseDecryptorUtil();
public static LicenseDecryptorUtil getInstance() {
return instance;
}
private final ObjectMapper objectMapper = ObjectMapperUtil.getInstance().getDefaultObjectMapper();
private LicenseDecryptorUtil() {
}
public LicenseInfo createLicenseInfo(LicenseResponse licenseResponse) throws JsonProcessingException, InvalidLicenseException {
if (licenseResponse == null || licenseResponse.getBoostLicense() == null) {
throw new InvalidLicenseException("License or boost license are null");
}
DecryptedLicenseResponse decrypted = parseLicenseJSON(licenseResponse.getBoostLicense());
return new LicenseInfo(licenseResponse, decrypted);
}
/**
* Decrypts a boost license response.
*
* @param licenseResponse The boost license response.
* @return The decrypted license response.
* @throws JsonProcessingException
* @throws
* com.basistech.df.cybertriage.autopsy.ctapi.util.LicenseDecryptorUtil.InvalidLicenseException
*/
public DecryptedLicenseResponse parseLicenseJSON(BoostLicenseResponse licenseResponse) throws JsonProcessingException, InvalidLicenseException {
String decryptedJsonResponse;
try {
decryptedJsonResponse = decryptLicenseString(
licenseResponse.getEncryptedJson(),
licenseResponse.getIv(),
licenseResponse.getEncryptedKey(),
licenseResponse.getVersion()
);
} catch (IOException | GeneralSecurityException ex) {
throw new InvalidLicenseException("An exception occurred while parsing the license string", ex);
}
DecryptedLicenseResponse decryptedLicense = objectMapper.readValue(decryptedJsonResponse, DecryptedLicenseResponse.class);
if (!"AUTOPSY".equalsIgnoreCase(decryptedLicense.getProduct())) {
// license file is expected to contain product of "CYBERTRIAGE"
throw new InvalidLicenseException("Not a valid Autopsy license");
}
return decryptedLicense;
}
private String decryptLicenseString(String encryptedJson, String ivBase64, String encryptedKey, String version) throws IOException, GeneralSecurityException, InvalidLicenseException {
if (!"1.0".equals(version)) {
throw new InvalidLicenseException("Unexpected file version: " + version);
}
byte[] encryptedKeyBytes = Base64.getDecoder().decode(encryptedKey);
byte[] keyBytes = decryptKey(encryptedKeyBytes);
SecretKey key = new SecretKeySpec(keyBytes, 0, keyBytes.length, "AES");
byte[] ivBytes = Base64.getDecoder().decode(ivBase64);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
byte[] encryptedLicenseJsonBytes = Base64.getDecoder().decode(encryptedJson);
String algorithm = "AES/CBC/PKCS5Padding";
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] licenseJsonBytes = cipher.doFinal(encryptedLicenseJsonBytes);
return new String(licenseJsonBytes, StandardCharsets.UTF_8);
}
private PublicKey getPublicKey() throws InvalidKeySpecException, NoSuchAlgorithmException {
String publicKeyString = """
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwIKulLyaLQ2WeO0gIW2G
3jQqny3Y/7VUevBKulAEywaUbvECvZ4zGsnaMyACjXxMNkA1xU2WeSMP/WqC03wz
4d71liUeAqOYKMdGHXFN2qswWz/ufK6An0pTEqYaoiUfcwSBVo2ZTUcMQexScKaS
ghmaWqBHBYx+lBkVMcLG2PtLDRZbqgJvJr2QCzMSVUpEGGQEWs7YolIq46KCgqsq
pTdfrdqd59x6oRhTLegswzxwLyouvrKbRqKR2ZRbVvlGtUnnnlLDuhEfd0flMxuv
W98Siw6dWe1K3x45nDu5py2G9Q9fZS8/2KHUC6QcLLstLIoPnZjCl9Lcur1U6s9N
f5aLI9mwMfmSJsoVOuwx2/MC98uHvPoPbG4ZjiT0aaGg4JccTGD6pssDA35zPhkk
1l6wktEYtyF2A7zjzuFxioQz8fHBzIbHPCxzu4S2gh3qOVFf7c9COmX9MsnB70o2
EZ1rxlFIJ7937IGJNwWOQuiMKTpEeT6BwTdQNZQPqCUGvZ5eEjhrm57yCF4zuyrt
AR8DG7ahK2YAarADHRyxTuxH1qY7E5/CTQKYk9tIYsV4O05CKj7B8rBMtjVNjb4b
d7JwPW43Z3J6jo/gLlVdGSPg8vQDNVLl6sdDM4Pm1eJEzgR2JlqXDCRDUGNNsXH2
qt9Ru8ykX7PAfF2Q3/qg1jkCAwEAAQ==
-----END PUBLIC KEY-----
""";
publicKeyString = publicKeyString.replaceAll("-----BEGIN PUBLIC KEY-----", "").replaceAll("-----END PUBLIC KEY-----", "").replaceAll("\\s", "");
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString);
KeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
private byte[] decryptKey(byte[] encryptedKeyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
PublicKey publicKey = getPublicKey();
Cipher decryptCipher = Cipher.getInstance("RSA");
decryptCipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptedBytes = decryptCipher.doFinal(encryptedKeyBytes);
return decryptedBytes;
}
public class InvalidLicenseException extends Exception {
public InvalidLicenseException(String message) {
super(message);
}
public InvalidLicenseException(String message, Throwable cause) {
super(message, cause);
}
}
}

View File

@ -0,0 +1,45 @@
/*
* 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.util;
import com.google.common.base.Charsets;
import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import org.apache.commons.lang3.StringUtils;
/**
*
* @author jayaram
*/
public class Md5HashUtil {
/**
* Returns MD5 hash value for the lower case value of the string provided.
* @param inp
* @return
*/
public static String getMD5MessageDigest(String inp) {
if (StringUtils.isNotBlank(inp)) {
HashFunction hf = Hashing.md5(); // Using despite its deprecation as md5 is good enough for our uses.
HashCode hc = hf.newHasher()
.putString(inp.toLowerCase(), Charsets.UTF_8)
.hash();
return hc.toString();
}
return "";
}
}

View File

@ -0,0 +1,190 @@
/*
* 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.util;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.util.Locale;
import java.util.function.Function;
/**
* Creates default ObjectMapper
*/
public class ObjectMapperUtil {
private static final ObjectMapperUtil instance = new ObjectMapperUtil();
public static ObjectMapperUtil getInstance() {
return instance;
}
private ObjectMapperUtil() {
}
public ObjectMapper getDefaultObjectMapper() {
ObjectMapper defaultMapper = new ObjectMapper();
defaultMapper.registerModule(new JavaTimeModule());
return defaultMapper;
}
public static class UTCBaseZonedDateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {
private final DateTimeFormatter formatter;
public UTCBaseZonedDateTimeDeserializer(DateTimeFormatter formatter) {
this.formatter = formatter;
}
@Override
public ZonedDateTime deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JacksonException {
String date = jp.getText();
if (date == null) {
return null;
}
try {
LocalDateTime ldt = LocalDateTime.parse(date, formatter);
return ZonedDateTime.of(ldt, ZoneOffset.UTC);
} catch (DateTimeParseException ex) {
return null;
}
}
}
public static class ZonedDateTimeDeserializer extends UTCBaseZonedDateTimeDeserializer {
public ZonedDateTimeDeserializer() {
super(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
}
public static class MDYDateDeserializer extends JsonDeserializer<ZonedDateTime> {
private final DateTimeFormatter formatter;
public MDYDateDeserializer() {
this.formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("MMM d, [uuuu][uu]")
.toFormatter(Locale.ENGLISH);
}
@Override
public ZonedDateTime deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JacksonException {
String date = jp.getText();
if (date == null) {
return null;
}
try {
LocalDate ld = LocalDate.parse(date, formatter);
LocalDateTime ldt = ld.atStartOfDay();
return ZonedDateTime.of(ldt, ZoneOffset.UTC);
} catch (DateTimeParseException ex) {
return null;
}
}
}
public static class EpochTimeDeserializer<T> extends JsonDeserializer<T> {
private final Function<Long, T> timeDeserializer;
public EpochTimeDeserializer(Function<Long, T> timeDeserializer) {
this.timeDeserializer = timeDeserializer;
}
@Override
public T deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JacksonException {
JsonNode node = jp.getCodec().readTree(jp);
Long timeVal = null;
if (node.isNumber()) {
timeVal = node.asLong();
} else {
String nodeText = node.asText();
try {
timeVal = Long.parseLong(nodeText);
} catch (NumberFormatException ex) {
// do nothing if can't parse as number
}
}
if (timeVal != null) {
try {
return timeDeserializer.apply(timeVal);
} catch (DateTimeException ex) {
// do nothing if can't parse to epoch
}
}
return null;
}
}
public static class InstantEpochMillisDeserializer extends EpochTimeDeserializer<Instant> {
public InstantEpochMillisDeserializer() {
super(InstantEpochMillisDeserializer::convert);
}
private static Instant convert(Long longVal) {
try {
return Instant.ofEpochMilli(longVal);
} catch (DateTimeException ex) {
// do nothing if can't parse to epoch
return null;
}
}
}
public static class InstantEpochSecsDeserializer extends EpochTimeDeserializer<Instant> {
public InstantEpochSecsDeserializer() {
super(InstantEpochSecsDeserializer::convert);
}
private static Instant convert(Long longVal) {
try {
return Instant.ofEpochSecond(longVal);
} catch (DateTimeException ex) {
// do nothing if can't parse to epoch
return null;
}
}
}
}

View File

@ -0,0 +1,9 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
OptionsCategory_Name_CyberTriage=Cyber Triage
OptionsCategory_Keywords_CyberTriage=Cyber Triage,Cyber,Triage
LicenseDisclaimerPanel.disclaimer.text=<html>The Cyber Triage Malware Scanner module uses 40+ malware scanning engines to identify if Windows executables are malicious. It requires a paid subscription to use.</html>
LicenseDisclaimerPanel.purchaseFromLabel.text=You can purchase a license from
LicenseDisclaimerPanel.border.title=Disclaimer
LicenseDisclaimerPanel.trialLabel.text=You can try a free 7-day trial from

View File

@ -0,0 +1,9 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
OptionsCategory_Name_CyberTriage=Cyber Triage
OptionsCategory_Keywords_CyberTriage=Cyber Triage,Cyber,Triage
LicenseDisclaimerPanel.disclaimer.text=<html>The Cyber Triage Malware Scanner module uses 40+ malware scanning engines to identify if Windows executables are malicious. It requires a paid subscription to use.</html>
LicenseDisclaimerPanel.purchaseFromLabel.text=You can purchase a license from
LicenseDisclaimerPanel.border.title=Disclaimer
LicenseDisclaimerPanel.trialLabel.text=You can try a free 7-day trial from

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,120,0,0,2,2"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="scrollPane">
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="contentPane">
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>

View File

@ -0,0 +1,166 @@
/*
* 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.ctoptions;
import com.basistech.df.cybertriage.autopsy.ctoptions.subpanel.CTOptionsSubPanel;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.swing.JPanel;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.Lookup;
import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel;
/**
* Options panel for Cyber Triage.
*/
public class CTOptionsPanel extends IngestModuleGlobalSettingsPanel {
private static final int MAX_SUBPANEL_WIDTH = 650;
private static final Logger logger = Logger.getLogger(CTOptionsPanel.class.getName());
private final List<CTOptionsSubPanel> subPanels;
/**
* Creates new form CTOptions loading any CTOptionsSubPanel instances to be
* displayed.
*/
public CTOptionsPanel() {
initComponents();
Collection<? extends CTOptionsSubPanel> coll = Lookup.getDefault().lookupAll(CTOptionsSubPanel.class);
Stream<? extends CTOptionsSubPanel> panelStream = coll != null ? coll.stream() : Stream.empty();
this.subPanels = panelStream
.map(panel -> {
try {
// lookup is returning singleton instances which means this panel gets messed up when accessed
// from multiple places because the panel's children are being added to a different CTOptionsPanel
return (CTOptionsSubPanel) panel.getClass().getConstructor().newInstance();
} catch (Exception ex) {
return null;
}
})
.filter(item -> item != null)
.sorted(Comparator.comparing(p -> p.getClass().getSimpleName().toUpperCase()).reversed())
.collect(Collectors.toList());
addSubOptionsPanels(this.subPanels);
}
private void addSubOptionsPanels(List<CTOptionsSubPanel> subPanels) {
GridBagConstraints disclaimerConstraints = new GridBagConstraints();
disclaimerConstraints.gridx = 0;
disclaimerConstraints.gridy = 0;
disclaimerConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
disclaimerConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
disclaimerConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
disclaimerConstraints.weighty = 0;
disclaimerConstraints.weightx = 0;
for (int i = 0; i < subPanels.size(); i++) {
CTOptionsSubPanel subPanel = subPanels.get(i);
subPanel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(OptionsPanelController.PROP_CHANGED)) {
CTOptionsPanel.this.firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
}
});
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = i + 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
gridBagConstraints.weighty = 0;
gridBagConstraints.weightx = 0;
contentPane.add(subPanel, gridBagConstraints);
}
GridBagConstraints verticalConstraints = new GridBagConstraints();
verticalConstraints.gridx = 0;
verticalConstraints.gridy = subPanels.size() + 1;
verticalConstraints.weighty = 1;
verticalConstraints.weightx = 0;
JPanel verticalSpacer = new JPanel();
verticalSpacer.setMinimumSize(new Dimension(MAX_SUBPANEL_WIDTH, 0));
verticalSpacer.setPreferredSize(new Dimension(MAX_SUBPANEL_WIDTH, 0));
verticalSpacer.setMaximumSize(new Dimension(MAX_SUBPANEL_WIDTH, Short.MAX_VALUE));
contentPane.add(verticalSpacer, verticalConstraints);
GridBagConstraints horizontalConstraints = new GridBagConstraints();
horizontalConstraints.gridx = 1;
horizontalConstraints.gridy = 0;
horizontalConstraints.weighty = 0;
horizontalConstraints.weightx = 1;
JPanel horizontalSpacer = new JPanel();
contentPane.add(horizontalSpacer, horizontalConstraints);
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane();
contentPane = new javax.swing.JPanel();
setLayout(new java.awt.BorderLayout());
contentPane.setLayout(new java.awt.GridBagLayout());
scrollPane.setViewportView(contentPane);
add(scrollPane, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
@Override
public void saveSettings() {
subPanels.forEach(panel -> panel.saveSettings());
}
public void loadSavedSettings() {
subPanels.forEach(panel -> panel.loadSettings());
}
public boolean valid() {
return subPanels.stream().allMatch(panel -> panel.valid());
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel contentPane;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,133 @@
/*
* 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.ctoptions;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JComponent;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
/**
* Options panel controller for CyberTriage.
*/
@OptionsPanelController.TopLevelRegistration(categoryName = "#OptionsCategory_Name_CyberTriage",
iconBase = "com/basistech/df/cybertriage/autopsy/images/logo.png",
position = 999999,
keywords = "#OptionsCategory_Keywords_CyberTriage",
keywordsCategory = "CyberTriage")
public final class CTOptionsPanelController extends OptionsPanelController {
private CTOptionsPanel panel;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private boolean changed;
/**
* Component should load its data here.
*/
@Override
public void update() {
getPanel().loadSavedSettings();
changed = false;
}
/**
* This method is called when both the Ok and Apply buttons are pressed. It
* applies to any of the panels that have been opened in the process of
* using the options pane.
*/
@Override
public void applyChanges() {
if (changed) {
getPanel().saveSettings();
changed = false;
}
}
/**
* This method is called when the Cancel button is pressed. It applies to
* any of the panels that have been opened in the process of using the
* options pane.
*/
@Override
public void cancel() {
}
@Override
public boolean isValid() {
return getPanel().valid();
}
/**
* Used to determine whether any changes have been made to this controller's
* panel.
*
* @return Whether or not a change has been made.
*/
@Override
public boolean isChanged() {
return changed;
}
@Override
public HelpCtx getHelpCtx() {
return null;
}
@Override
public JComponent getComponent(Lookup masterLookup) {
return getPanel();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener l) {
pcs.removePropertyChangeListener(l);
}
private CTOptionsPanel getPanel() {
if (panel == null) {
panel = new CTOptionsPanel();
panel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(OptionsPanelController.PROP_CHANGED)) {
changed();
}
}
});
}
return panel;
}
void changed() {
if (!changed) {
changed = true;
pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
}
pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
}
}

View File

@ -0,0 +1,27 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTLicenseDialog.title=Add a License...
CTLicenseDialog.licenseNumberLabel.text=License Number:
CTLicenseDialog.licenseNumberTextField.text=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
CTLicenseDialog.cancelButton.text=Cancel
CTLicenseDialog.okButton.text=Ok
CTLicenseDialog.warningLabel.text=
CTMalwareScannerOptionsPanel.hashLookupsRemainingLabel.text=
CTMalwareScannerOptionsPanel.countersResetLabel.text=
CTMalwareScannerOptionsPanel.maxFileUploadsLabel.text=
CTMalwareScannerOptionsPanel.maxHashLookupsLabel.text=
CTMalwareScannerOptionsPanel.malwareScansMessageLabel.text=
CTMalwareScannerOptionsPanel.malwareScansPanel.border.title=Malware Scanner
CTMalwareScannerOptionsPanel.licenseInfoAddButton.text=Add License
CTMalwareScannerOptionsPanel.licenseInfoIdLabel.text=
CTMalwareScannerOptionsPanel.licenseInfoExpiresLabel.text=
CTMalwareScannerOptionsPanel.fileUploadsRemainingLabel.text=
CTMalwareScannerOptionsPanel.licenseInfoUserLabel.text=
EULADialog.cancelButton.text=Cancel
EULADialog.acceptButton.text=Accept
EULADialog.title=Cyber Triage End User License Agreement
CTMalwareScannerOptionsPanel.licenseInfoMessageLabel.text=
CTMalwareScannerOptionsPanel.disclaimer.text=<html>The Cyber Triage Malware Scanner module uses 40+ malware scanning engines to identify if Windows executables are malicious. It requires a paid subscription to use.</html>
CTMalwareScannerOptionsPanel.purchaseFromLabel.text=For licensing information, visit

View File

@ -0,0 +1,65 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTLicenseDialog.title=Add a License...
CTLicenseDialog.licenseNumberLabel.text=License Number:
CTLicenseDialog.licenseNumberTextField.text=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
CTLicenseDialog.cancelButton.text=Cancel
CTLicenseDialog.okButton.text=Ok
CTLicenseDialog.warningLabel.text=
CTLicenseDialog_verifyInput_licenseNumberError=<html>Please verify license number format of 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'</html>
CTMalwareScannerOptionsPanel.hashLookupsRemainingLabel.text=
CTMalwareScannerOptionsPanel.countersResetLabel.text=
CTMalwareScannerOptionsPanel.maxFileUploadsLabel.text=
CTMalwareScannerOptionsPanel.maxHashLookupsLabel.text=
CTMalwareScannerOptionsPanel.malwareScansMessageLabel.text=
CTMalwareScannerOptionsPanel.malwareScansPanel.border.title=Malware Scanner
CTMalwareScannerOptionsPanel.licenseInfoAddButton.text=Add License
CTMalwareScannerOptionsPanel.licenseInfoIdLabel.text=
CTMalwareScannerOptionsPanel.licenseInfoExpiresLabel.text=
CTMalwareScannerOptionsPanel.fileUploadsRemainingLabel.text=
CTMalwareScannerOptionsPanel.licenseInfoUserLabel.text=
CTMalwareScannerOptionsPanel_getResetSuffix_daily=/day
CTMalwareScannerOptionsPanel_getResetSuffix_hourly=/hour
CTMalwareScannerOptionsPanel_getResetSuffix_monthly=/month
CTMalwareScannerOptionsPanel_getResetSuffix_weekly=/week
CTMalwareScannerOptionsPanel_licenseAddDialog_desc=License Number:
CTMalwareScannerOptionsPanel_licenseAddDialog_title=Add a License...
CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_desc=The license number has already been entered
CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_title=License Number Already Entered
CTMalwareScannerOptionsPanel_licenseAddDialogPatternErr_desc=Please verify that license number is of format 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
CTMalwareScannerOptionsPanel_licenseAddDialogPatternErr_title=Invalid License Number
CTMalwareScannerOptionsPanel_LicenseFetcher_apiErr_title=Server Error
CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_desc=A general error occurred while fetching license information. Please try again later.
CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_title=General Error
# {0} - expiresDate
CTMalwareScannerOptionsPanel_licenseInfo_expires=Expires: {0}
# {0} - idNumber
CTMalwareScannerOptionsPanel_licenseInfo_id=ID: {0}
# {0} - userName
# {1} - email
CTMalwareScannerOptionsPanel_licenseInfo_userInfo=<html>User: {0}<br/>Email: {1}</html>
# {0} - countersResetDate
CTMalwareScannerOptionsPanel_malwareScans_countersReset=Counters reset: {0}
# {0} - fileUploadsRemaining
CTMalwareScannerOptionsPanel_malwareScans_fileUploadsRemaining=File uploads remaining: {0}
# {0} - hashLookupsRemaining
CTMalwareScannerOptionsPanel_malwareScans_hashLookupsRemaining=Hash lookups remaining: {0}
# {0} - maxDailyFileLookups
# {1} - resetSuffix
CTMalwareScannerOptionsPanel_malwareScans_maxDailyFileLookups=Max file uploads: {0}{1}
# {0} - maxDailyLookups
# {1} - resetSuffix
CTMalwareScannerOptionsPanel_malwareScans_maxDailyHashLookups=Max Hash lookups: {0}{1}
CTMalwareScannerOptionsPanel_MalwareScansFetcher_apiErr_title=Server Error
CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_desc=A general error occurred while fetching malware scans information. Please try again later.
CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_title=General Error
CTOPtionsPanel_loadLicenseInfo_loading=Loading...
CTOPtionsPanel_loadMalwareScansInfo_loading=Loading...
EULADialog.cancelButton.text=Cancel
EULADialog.acceptButton.text=Accept
EULADialog.title=Cyber Triage End User License Agreement
CTMalwareScannerOptionsPanel.licenseInfoMessageLabel.text=
CTMalwareScannerOptionsPanel.disclaimer.text=<html>The Cyber Triage Malware Scanner module uses 40+ malware scanning engines to identify if Windows executables are malicious. It requires a paid subscription to use.</html>
CTMalwareScannerOptionsPanel.purchaseFromLabel.text=For licensing information, visit

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/Bundle.properties" key="CTLicenseDialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="alwaysOnTop" type="boolean" value="true"/>
<Property name="resizable" type="boolean" value="false"/>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,122,0,0,1,-19"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="licenseNumberLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTLicenseDialog.licenseNumberLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="warningLabel">
<Properties>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="java.awt.Color.RED" type="code"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTLicenseDialog.warningLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[419, 36]"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[419, 36]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[419, 36]"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="3" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="buttonPadding">
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Container>
<Component class="javax.swing.JButton" name="okButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTLicenseDialog.okButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="2" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="cancelButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTLicenseDialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JTextField" name="licenseNumberTextField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTLicenseDialog.licenseNumberTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,196 @@
/*
* 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.ctoptions.ctcloud;
import java.util.regex.Pattern;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.commons.lang3.StringUtils;
import org.openide.util.NbBundle.Messages;
/**
* License dialog
*/
class CTLicenseDialog extends javax.swing.JDialog {
private static final Pattern LICENSE_PATTERN = Pattern.compile("^\\s*[a-zA-Z0-9\\-]+?\\s*$");
private String licenseString = null;
/**
* Creates new form CTLicenseDialog
*/
public CTLicenseDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
this.licenseNumberTextField.getDocument().putProperty("filterNewlines", Boolean.TRUE);
this.licenseNumberTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
verifyInput();
}
@Override
public void insertUpdate(DocumentEvent e) {
verifyInput();
}
@Override
public void removeUpdate(DocumentEvent e) {
verifyInput();
}
});
}
String getValue() {
return licenseString;
}
@Messages({
"CTLicenseDialog_verifyInput_licenseNumberError=<html>Please verify license number format of 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'</html>"
})
private void verifyInput() {
String licenseInput = StringUtils.defaultString(this.licenseNumberTextField.getText());
if (LICENSE_PATTERN.matcher(licenseInput).matches()) {
this.warningLabel.setText("");
this.okButton.setEnabled(true);
} else {
this.warningLabel.setText(Bundle.CTLicenseDialog_verifyInput_licenseNumberError());
this.okButton.setEnabled(false);
}
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JLabel licenseNumberLabel = new javax.swing.JLabel();
warningLabel = new javax.swing.JLabel();
javax.swing.JPanel buttonPadding = new javax.swing.JPanel();
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
licenseNumberTextField = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.title")); // NOI18N
setAlwaysOnTop(true);
setResizable(false);
getContentPane().setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(licenseNumberLabel, org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.licenseNumberLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
getContentPane().add(licenseNumberLabel, gridBagConstraints);
warningLabel.setForeground(java.awt.Color.RED);
org.openide.awt.Mnemonics.setLocalizedText(warningLabel, org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.warningLabel.text")); // NOI18N
warningLabel.setMaximumSize(new java.awt.Dimension(419, 36));
warningLabel.setMinimumSize(new java.awt.Dimension(419, 36));
warningLabel.setPreferredSize(new java.awt.Dimension(419, 36));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(warningLabel, gridBagConstraints);
javax.swing.GroupLayout buttonPaddingLayout = new javax.swing.GroupLayout(buttonPadding);
buttonPadding.setLayout(buttonPaddingLayout);
buttonPaddingLayout.setHorizontalGroup(
buttonPaddingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
buttonPaddingLayout.setVerticalGroup(
buttonPaddingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 1.0;
getContentPane().add(buttonPadding, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.okButton.text")); // NOI18N
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(okButton, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.cancelButton.text")); // NOI18N
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(cancelButton, gridBagConstraints);
licenseNumberTextField.setText(org.openide.util.NbBundle.getMessage(CTLicenseDialog.class, "CTLicenseDialog.licenseNumberTextField.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(licenseNumberTextField, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
this.licenseString = this.licenseNumberTextField.getText();
this.dispose();
}//GEN-LAST:event_okButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
this.licenseString = null;
this.dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JTextField licenseNumberTextField;
private javax.swing.JButton okButton;
private javax.swing.JLabel warningLabel;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,101 @@
/*
* 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.ctoptions.ctcloud;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.util.LicenseDecryptorUtil;
import com.basistech.df.cybertriage.autopsy.ctapi.util.ObjectMapperUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
/**
* Handles persisting CT Settings.
*/
public class CTLicensePersistence {
private static final String CT_SETTINGS_DIR = "CyberTriage";
private static final String CT_LICENSE_FILENAME = "CyberTriageLicense.json";
private static final String MALWARE_INGEST_SETTINGS_FILENAME = "MalwareIngestSettings.json";
private static final Logger logger = Logger.getLogger(CTLicensePersistence.class.getName());
private static final CTLicensePersistence instance = new CTLicensePersistence();
private final ObjectMapper objectMapper = ObjectMapperUtil.getInstance().getDefaultObjectMapper();
public static CTLicensePersistence getInstance() {
return instance;
}
public synchronized boolean saveLicenseResponse(LicenseResponse licenseResponse) {
if (licenseResponse != null) {
File licenseFile = getCTLicenseFile();
try {
licenseFile.getParentFile().mkdirs();
objectMapper.writeValue(licenseFile, licenseResponse);
return true;
} catch (IOException ex) {
logger.log(Level.WARNING, "There was an error writing CyberTriage license to file: " + licenseFile.getAbsolutePath(), ex);
}
}
return false;
}
public synchronized Optional<LicenseResponse> loadLicenseResponse() {
Optional<LicenseResponse> toRet = Optional.empty();
File licenseFile = getCTLicenseFile();
if (licenseFile.exists() && licenseFile.isFile()) {
try {
toRet = Optional.ofNullable(objectMapper.readValue(licenseFile, LicenseResponse.class));
} catch (IOException ex) {
logger.log(Level.WARNING, "There was an error reading CyberTriage license to file: " + licenseFile.getAbsolutePath(), ex);
}
}
return toRet;
}
public synchronized Optional<LicenseInfo> loadLicenseInfo() {
return loadLicenseResponse().flatMap((license) -> {
try {
return Optional.ofNullable(LicenseDecryptorUtil.getInstance().createLicenseInfo(license));
} catch (JsonProcessingException | LicenseDecryptorUtil.InvalidLicenseException ex) {
logger.log(Level.WARNING, "There was an error decrypting license data from license file", ex);
return Optional.empty();
}
});
}
private File getCTLicenseFile() {
return Paths.get(PlatformUtil.getModuleConfigDirectory(), CT_SETTINGS_DIR, CT_LICENSE_FILENAME).toFile();
}
private File getMalwareIngestFile() {
return Paths.get(PlatformUtil.getModuleConfigDirectory(), CT_SETTINGS_DIR, MALWARE_INGEST_SETTINGS_FILENAME).toFile();
}
}

View File

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.8" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,90,0,0,1,-29"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="malwareScansPanel">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Malware Scanner">
<ResourceString PropertyName="titleX" bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.malwareScansPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="disclaimer">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.disclaimer.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="verticalAlignment" type="int" value="1"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="licenseInfoPanel">
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="licenseInfoMessageLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.licenseInfoMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="licenseInfoExpiresLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.licenseInfoExpiresLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="licenseInfoIdLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.licenseInfoIdLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="licenseInfoUserLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.licenseInfoUserLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="licenseInfoAddButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.licenseInfoAddButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="licenseInfoAddButtonActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="2" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="12" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="maxFileUploadsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.maxFileUploadsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="maxHashLookupsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.maxHashLookupsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="hashLookupsRemainingLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.hashLookupsRemainingLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="malwareScansMessageLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.malwareScansMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="countersResetLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.countersResetLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="5" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="fileUploadsRemainingLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.fileUploadsRemainingLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="4" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="purchasePanel">
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="purchaseFromLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="CTMalwareScannerOptionsPanel.purchaseFromLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="purchaseLink">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="getHtmlLink(PURCHASE_URL)" type="code"/>
</Property>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Hand Cursor"/>
</Property>
</Properties>
<Events>
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="purchaseLinkMouseClicked"/>
</Events>
<AuxValues>
<AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="3" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>

View File

@ -0,0 +1,746 @@
/*
* 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.ctoptions.ctcloud;
import com.basistech.df.cybertriage.autopsy.ctoptions.subpanel.CTOptionsSubPanel;
import com.basistech.df.cybertriage.autopsy.ctapi.CTCloudException;
import com.basistech.df.cybertriage.autopsy.ctapi.CTApiDAO;
import com.basistech.df.cybertriage.autopsy.ctapi.json.AuthTokenResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.json.DecryptedLicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseLimitType;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseResponse;
import com.basistech.df.cybertriage.autopsy.ctapi.util.LicenseDecryptorUtil;
import com.basistech.df.cybertriage.autopsy.ctapi.util.LicenseDecryptorUtil.InvalidLicenseException;
import java.awt.Desktop;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import org.apache.commons.lang3.StringUtils;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.openide.util.lookup.ServiceProvider;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.core.UserPreferences;
/**
* Options panel to be displayed in the CTOptionsPanel for settings regarding
* Cyber Triage Malware Scanner settings and license setup.
*/
@ServiceProvider(service = CTOptionsSubPanel.class)
public class CTMalwareScannerOptionsPanel extends CTOptionsSubPanel {
private static final Logger logger = Logger.getLogger(CTMalwareScannerOptionsPanel.class.getName());
private static final DateTimeFormatter LICENSE_EXPIRES_FORMAT = DateTimeFormatter
.ofPattern("MMMM d, YYYY")
.withZone(ZoneId.of(UserPreferences.getInferredUserTimeZone()));
private static final DateTimeFormatter MALWARE_SCANS_RESET_FORMAT = DateTimeFormatter
.ofPattern("MMM d, YYYY' at 'h:mma")
.withZone(ZoneId.of(UserPreferences.getInferredUserTimeZone()));
private final CTApiDAO ctApiDAO = CTApiDAO.getInstance();
private final CTLicensePersistence ctPersistence = CTLicensePersistence.getInstance();
private volatile LicenseInfo licenseInfo = null;
private volatile String licenseInfoMessage = null;
private volatile LicenseFetcher licenseFetcher = null;
private static final String PURCHASE_URL = "https://cybertriage.com/autopsy-malware-module";
private volatile AuthTokenResponse authTokenResponse = null;
private volatile String authTokenMessage = null;
private volatile AuthTokenFetcher authTokenFetcher = null;
/**
* Main constructor.
*/
public CTMalwareScannerOptionsPanel() {
initComponents();
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
synchronized (CTMalwareScannerOptionsPanel.this) {
if (CTMalwareScannerOptionsPanel.this.isLicenseAddRunning()) {
CTMalwareScannerOptionsPanel.this.licenseFetcher.cancel(true);
CTMalwareScannerOptionsPanel.this.licenseFetcher = null;
}
if (CTMalwareScannerOptionsPanel.this.isMalwareScansRunning()) {
CTMalwareScannerOptionsPanel.this.authTokenFetcher.cancel(true);
CTMalwareScannerOptionsPanel.this.authTokenFetcher = null;
}
}
}
@Override
public void componentShown(ComponentEvent e) {
synchronized (CTMalwareScannerOptionsPanel.this) {
if (CTMalwareScannerOptionsPanel.this.licenseInfo != null) {
loadMalwareScansInfo(CTMalwareScannerOptionsPanel.this.licenseInfo);
}
}
}
}
);
}
@Override
public synchronized void saveSettings() {
ctPersistence.saveLicenseResponse(getLicenseInfo());
}
@Override
public boolean valid() {
return true;
}
@Override
public synchronized void loadSettings() {
Optional<LicenseInfo> licenseInfoOpt = ctPersistence.loadLicenseInfo();
LicenseInfo licenseInfo = licenseInfoOpt.orElse(null);
setLicenseDisplay(licenseInfo, null);
setMalwareScansDisplay(null, null);
if (licenseInfo != null) {
loadMalwareScansInfo(licenseInfo);
this.purchaseFromLabel.setVisible(false);
this.purchaseLink.setVisible(false);
} else {
this.purchaseFromLabel.setVisible(true);
this.purchaseLink.setVisible(true);
}
}
private static String getHtmlLink(String url) {
return "<html><span style=\"color: blue; text-decoration: underline\">" + url + "</span></html>";
}
private void gotoLink(String url) {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException | URISyntaxException e) {
logger.log(Level.SEVERE, "Error opening link to: " + url, e);
}
} else {
logger.log(Level.WARNING, "Desktop API is not supported. Link cannot be opened.");
}
}
private synchronized LicenseResponse getLicenseInfo() {
return this.licenseInfo == null ? null : this.licenseInfo.getLicenseResponse();
}
private synchronized void setLicenseDisplay(LicenseInfo licenseInfo, String licenseMessage) {
this.licenseInfo = licenseInfo;
this.licenseInfoMessage = licenseMessage;
renderLicenseState();
}
private synchronized void setMalwareScansDisplay(AuthTokenResponse authTokenResponse, String authTokenMessage) {
this.authTokenResponse = authTokenResponse;
this.authTokenMessage = authTokenMessage;
renderLicenseState();
}
/**
* @return True if there is an operation to fetch the license.
*/
private synchronized boolean isLicenseAddRunning() {
return this.licenseFetcher != null && !this.licenseFetcher.isCancelled() && !this.licenseFetcher.isDone();
}
/**
* @return True if there is an operation to fetch malware scans information.
*/
private synchronized boolean isMalwareScansRunning() {
return this.authTokenFetcher != null && !this.authTokenFetcher.isCancelled() && !this.authTokenFetcher.isDone();
}
@Messages({
"CTOPtionsPanel_loadLicenseInfo_loading=Loading..."
})
private synchronized void loadLicenseInfo(String licenseNumber) {
if (isLicenseAddRunning()) {
this.licenseFetcher.cancel(true);
}
setLicenseDisplay(null, Bundle.CTOPtionsPanel_loadLicenseInfo_loading());
setMalwareScansDisplay(null, null);
this.licenseFetcher = new LicenseFetcher(licenseNumber);
this.licenseFetcher.execute();
}
@Messages({
"CTOPtionsPanel_loadMalwareScansInfo_loading=Loading..."
})
private synchronized void loadMalwareScansInfo(LicenseInfo licenseInfo) {
if (isMalwareScansRunning()) {
this.authTokenFetcher.cancel(true);
}
if (licenseInfo == null || licenseInfo.getDecryptedLicense() == null) {
setMalwareScansDisplay(null, null);
return;
}
setMalwareScansDisplay(null, Bundle.CTOPtionsPanel_loadMalwareScansInfo_loading());
this.authTokenFetcher = new AuthTokenFetcher(licenseInfo.getDecryptedLicense());
this.authTokenFetcher.execute();
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
malwareScansPanel = new javax.swing.JPanel();
javax.swing.JLabel disclaimer = new javax.swing.JLabel();
javax.swing.JPanel licenseInfoPanel = new javax.swing.JPanel();
licenseInfoMessageLabel = new javax.swing.JLabel();
licenseInfoExpiresLabel = new javax.swing.JLabel();
licenseInfoIdLabel = new javax.swing.JLabel();
licenseInfoUserLabel = new javax.swing.JLabel();
licenseInfoAddButton = new javax.swing.JButton();
maxFileUploadsLabel = new javax.swing.JLabel();
maxHashLookupsLabel = new javax.swing.JLabel();
hashLookupsRemainingLabel = new javax.swing.JLabel();
malwareScansMessageLabel = new javax.swing.JLabel();
countersResetLabel = new javax.swing.JLabel();
fileUploadsRemainingLabel = new javax.swing.JLabel();
javax.swing.JPanel purchasePanel = new javax.swing.JPanel();
purchaseFromLabel = new javax.swing.JLabel();
purchaseLink = new javax.swing.JLabel();
setLayout(new java.awt.GridBagLayout());
malwareScansPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.malwareScansPanel.border.title"))); // NOI18N
malwareScansPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(disclaimer, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.disclaimer.text")); // NOI18N
disclaimer.setVerticalAlignment(javax.swing.SwingConstants.TOP);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
malwareScansPanel.add(disclaimer, gridBagConstraints);
licenseInfoPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(licenseInfoMessageLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.licenseInfoMessageLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(licenseInfoMessageLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(licenseInfoExpiresLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.licenseInfoExpiresLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(licenseInfoExpiresLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(licenseInfoIdLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.licenseInfoIdLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(licenseInfoIdLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(licenseInfoUserLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.licenseInfoUserLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(licenseInfoUserLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(licenseInfoAddButton, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.licenseInfoAddButton.text")); // NOI18N
licenseInfoAddButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
licenseInfoAddButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
licenseInfoPanel.add(licenseInfoAddButton, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(maxFileUploadsLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.maxFileUploadsLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
licenseInfoPanel.add(maxFileUploadsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(maxHashLookupsLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.maxHashLookupsLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(maxHashLookupsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(hashLookupsRemainingLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.hashLookupsRemainingLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(hashLookupsRemainingLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(malwareScansMessageLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.malwareScansMessageLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
licenseInfoPanel.add(malwareScansMessageLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(countersResetLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.countersResetLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
licenseInfoPanel.add(countersResetLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(fileUploadsRemainingLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.fileUploadsRemainingLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
licenseInfoPanel.add(fileUploadsRemainingLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
malwareScansPanel.add(licenseInfoPanel, gridBagConstraints);
purchasePanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(purchaseFromLabel, org.openide.util.NbBundle.getMessage(CTMalwareScannerOptionsPanel.class, "CTMalwareScannerOptionsPanel.purchaseFromLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
purchasePanel.add(purchaseFromLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(purchaseLink, getHtmlLink(PURCHASE_URL));
purchaseLink.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
purchaseLink.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
purchaseLinkMouseClicked(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0);
purchasePanel.add(purchaseLink, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
malwareScansPanel.add(purchasePanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
add(malwareScansPanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
@Messages({
"CTMalwareScannerOptionsPanel_licenseAddDialog_title=Add a License...",
"CTMalwareScannerOptionsPanel_licenseAddDialog_desc=License Number:",
"CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_title=License Number Already Entered",
"CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_desc=The license number has already been entered",
"CTMalwareScannerOptionsPanel_licenseAddDialogPatternErr_title=Invalid License Number",
"CTMalwareScannerOptionsPanel_licenseAddDialogPatternErr_desc=Please verify that license number is of format 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'"})
private void licenseInfoAddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_licenseInfoAddButtonActionPerformed
CTLicenseDialog licenseDialog = new CTLicenseDialog(WindowManager.getDefault().getMainWindow(), true);
licenseDialog.setLocationRelativeTo(this);
licenseDialog.setVisible(true);
String licenseNumber = licenseDialog.getValue();
if (licenseNumber != null) {
synchronized (this) {
if (this.licenseInfo == null || !licenseNumber.trim().equalsIgnoreCase(this.licenseInfo.getDecryptedLicense().getBoostLicenseId())) {
loadLicenseInfo(licenseNumber);
return;
}
}
JOptionPane.showMessageDialog(
this,
Bundle.CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_desc(),
Bundle.CTMalwareScannerOptionsPanel_licenseAddDialogEnteredErr_title(),
JOptionPane.INFORMATION_MESSAGE);
}
}//GEN-LAST:event_licenseInfoAddButtonActionPerformed
private void purchaseLinkMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_purchaseLinkMouseClicked
gotoLink(PURCHASE_URL);
}//GEN-LAST:event_purchaseLinkMouseClicked
@NbBundle.Messages({
"# {0} - userName",
"# {1} - email",
"CTMalwareScannerOptionsPanel_licenseInfo_userInfo=<html>User: {0}<br/>Email: {1}</html>",
"# {0} - expiresDate",
"CTMalwareScannerOptionsPanel_licenseInfo_expires=Expires: {0}",
"# {0} - idNumber",
"CTMalwareScannerOptionsPanel_licenseInfo_id=ID: {0}",
"# {0} - maxDailyLookups",
"# {1} - resetSuffix",
"CTMalwareScannerOptionsPanel_malwareScans_maxDailyHashLookups=Max Hash lookups: {0}{1}",
"# {0} - maxDailyFileLookups",
"# {1} - resetSuffix",
"CTMalwareScannerOptionsPanel_malwareScans_maxDailyFileLookups=Max file uploads: {0}{1}",
"# {0} - countersResetDate",
"CTMalwareScannerOptionsPanel_malwareScans_countersReset=Counters reset: {0}",
"# {0} - hashLookupsRemaining",
"CTMalwareScannerOptionsPanel_malwareScans_hashLookupsRemaining=Hash lookups remaining: {0}",
"# {0} - fileUploadsRemaining",
"CTMalwareScannerOptionsPanel_malwareScans_fileUploadsRemaining=File uploads remaining: {0}"})
private synchronized void renderLicenseState() {
this.licenseInfoAddButton.setEnabled(!isLicenseAddRunning());
this.licenseInfoMessageLabel.setVisible(StringUtils.isNotBlank(this.licenseInfoMessage));
this.licenseInfoMessageLabel.setText(this.licenseInfoMessage);
if (licenseInfo == null) {
this.licenseInfoExpiresLabel.setVisible(false);
this.licenseInfoIdLabel.setVisible(false);
this.licenseInfoUserLabel.setVisible(false);
this.purchaseFromLabel.setVisible(true);
this.purchaseLink.setVisible(true);
} else {
this.purchaseFromLabel.setVisible(false);
this.purchaseLink.setVisible(false);
this.licenseInfoExpiresLabel.setVisible(true);
this.licenseInfoExpiresLabel.setText(Bundle.CTMalwareScannerOptionsPanel_licenseInfo_expires(
this.licenseInfo.getDecryptedLicense().getExpirationDate() == null
? ""
: LICENSE_EXPIRES_FORMAT.format(this.licenseInfo.getDecryptedLicense().getExpirationDate())));
this.licenseInfoIdLabel.setVisible(true);
this.licenseInfoIdLabel.setText(Bundle.CTMalwareScannerOptionsPanel_licenseInfo_id(StringUtils.defaultString(this.licenseInfo.getDecryptedLicense().getBoostLicenseId())));
this.licenseInfoUserLabel.setVisible(true);
this.licenseInfoUserLabel.setText(Bundle.CTMalwareScannerOptionsPanel_licenseInfo_userInfo(
StringUtils.defaultString(this.licenseInfo.getDecryptedLicense().getCustomerName()),
StringUtils.defaultString(this.licenseInfo.getDecryptedLicense().getCustomerEmail())));
}
this.malwareScansMessageLabel.setVisible(StringUtils.isNotBlank(this.authTokenMessage));
this.malwareScansMessageLabel.setText(this.authTokenMessage);
if (authTokenResponse == null || this.licenseInfo == null) {
this.maxHashLookupsLabel.setVisible(false);
this.maxFileUploadsLabel.setVisible(false);
this.countersResetLabel.setVisible(false);
this.hashLookupsRemainingLabel.setVisible(false);
this.fileUploadsRemainingLabel.setVisible(false);
} else {
this.maxHashLookupsLabel.setVisible(true);
this.maxHashLookupsLabel.setText(Bundle.CTMalwareScannerOptionsPanel_malwareScans_maxDailyHashLookups(
this.authTokenResponse.getHashLookupLimit(),
getResetSuffix(this.licenseInfo.getDecryptedLicense().getLimitType())));
this.maxFileUploadsLabel.setVisible(true);
this.maxFileUploadsLabel.setText(Bundle.CTMalwareScannerOptionsPanel_malwareScans_maxDailyFileLookups(
this.authTokenResponse.getFileUploadLimit(),
getResetSuffix(this.licenseInfo.getDecryptedLicense().getLimitType())));
this.countersResetLabel.setVisible(true);
this.countersResetLabel.setText(getCountersResetText(this.licenseInfo.getDecryptedLicense().getLimitType(), this.authTokenResponse));
this.hashLookupsRemainingLabel.setVisible(true);
this.hashLookupsRemainingLabel.setText(
Bundle.CTMalwareScannerOptionsPanel_malwareScans_hashLookupsRemaining(
remaining(this.authTokenResponse.getHashLookupLimit(), this.authTokenResponse.getHashLookupCount())));
this.fileUploadsRemainingLabel.setVisible(true);
this.fileUploadsRemainingLabel.setText(
Bundle.CTMalwareScannerOptionsPanel_malwareScans_fileUploadsRemaining(
remaining(this.authTokenResponse.getFileUploadLimit(), this.authTokenResponse.getFileUploadCount())));
}
}
private static String getCountersResetText(LicenseLimitType limitType, AuthTokenResponse authTokenResponse) {
if (limitType == null || limitType == LicenseLimitType.NO_RESET) {
return "";
} else {
return Bundle.CTMalwareScannerOptionsPanel_malwareScans_countersReset(
MALWARE_SCANS_RESET_FORMAT.format(authTokenResponse.getResetDate()));
}
}
@Messages({
"CTMalwareScannerOptionsPanel_getResetSuffix_hourly=/hour",
"CTMalwareScannerOptionsPanel_getResetSuffix_daily=/day",
"CTMalwareScannerOptionsPanel_getResetSuffix_weekly=/week",
"CTMalwareScannerOptionsPanel_getResetSuffix_monthly=/month"
})
private String getResetSuffix(LicenseLimitType limitType) {
if (limitType == null) {
return "";
}
switch (limitType) {
case HOURLY:
return Bundle.CTMalwareScannerOptionsPanel_getResetSuffix_hourly();
case DAILY:
return Bundle.CTMalwareScannerOptionsPanel_getResetSuffix_daily();
case WEEKLY:
return Bundle.CTMalwareScannerOptionsPanel_getResetSuffix_weekly();
case MONTHLY:
return Bundle.CTMalwareScannerOptionsPanel_getResetSuffix_monthly();
case NO_RESET:
default:
return "";
}
}
private long remaining(Long total, Long used) {
total = total == null ? 0 : total;
used = used == null ? 0 : used;
return total - used;
}
private void acceptEula(LicenseResponse licenseResponse) {
try {
final EULADialog eulaDialog = new EULADialog(WindowManager.getDefault().getMainWindow(), true);
eulaDialog.setLocationRelativeTo(this);
eulaDialog.setSize(eulaDialog.getPreferredSize());
eulaDialog.setVisible(true);
if (eulaDialog.isAcceptPressed()) {
// only indicate a change to save if we have accepted EULA for a license
this.licenseInfo = LicenseDecryptorUtil.getInstance().createLicenseInfo(licenseResponse);
this.firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
} catch (IOException | InvalidLicenseException ex) {
logger.log(Level.WARNING, "An error occurred while fetching data", ex);
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_desc(),
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_title(),
JOptionPane.ERROR_MESSAGE);
} finally {
setLicenseDisplay(this.licenseInfo, null);
loadMalwareScansInfo(this.licenseInfo);
}
}
@NbBundle.Messages({
"CTMalwareScannerOptionsPanel_LicenseFetcher_apiErr_title=Server Error",
"CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_title=General Error",
"CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_desc=A general error occurred while fetching license information. Please try again later.",})
private class LicenseFetcher extends SwingWorker<LicenseResponse, Void> {
private final String licenseText;
public LicenseFetcher(String licenseText) {
this.licenseText = licenseText;
}
@Override
protected LicenseResponse doInBackground() throws Exception {
if (this.isCancelled()) {
return null;
}
return ctApiDAO.getLicenseInfo(licenseText);
}
@Override
protected void done() {
try {
LicenseResponse licenseResponse = get();
if (licenseResponse != null && licenseResponse.isSuccess()) {
SwingUtilities.invokeLater(() -> acceptEula(licenseResponse));
} else {
logger.log(Level.WARNING, "An API error occurred while fetching license information. License fetch was not successful");
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
CTCloudException.ErrorCode.UN_AUTHORIZED.getDescription(),
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_apiErr_title(),
JOptionPane.ERROR_MESSAGE);
setLicenseDisplay(licenseInfo, null);
loadMalwareScansInfo(licenseInfo);
}
} catch (InterruptedException | CancellationException ex) {
// ignore cancellation; just load current license
setLicenseDisplay(licenseInfo, null);
loadMalwareScansInfo(licenseInfo);
} catch (ExecutionException ex) {
if (ex.getCause() != null && ex.getCause() instanceof CTCloudException cloudEx) {
logger.log(Level.WARNING, "An API error occurred while fetching license information", cloudEx);
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
cloudEx.getErrorCode().getDescription(),
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_apiErr_title(),
JOptionPane.ERROR_MESSAGE);
} else {
logger.log(Level.WARNING, "An error occurred while fetching data", ex);
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_desc(),
Bundle.CTMalwareScannerOptionsPanel_LicenseFetcher_localErr_title(),
JOptionPane.ERROR_MESSAGE);
}
setLicenseDisplay(licenseInfo, null);
loadMalwareScansInfo(licenseInfo);
} finally {
synchronized (CTMalwareScannerOptionsPanel.this) {
CTMalwareScannerOptionsPanel.this.licenseFetcher = null;
}
}
}
}
@NbBundle.Messages({
"CTMalwareScannerOptionsPanel_MalwareScansFetcher_apiErr_title=Server Error",
"CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_title=General Error",
"CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_desc=A general error occurred while fetching malware scans information. Please try again later.",})
private class AuthTokenFetcher extends SwingWorker<AuthTokenResponse, Void> {
private final DecryptedLicenseResponse decryptedLicense;
public AuthTokenFetcher(DecryptedLicenseResponse decryptedLicense) {
this.decryptedLicense = decryptedLicense;
}
@Override
protected AuthTokenResponse doInBackground() throws Exception {
if (this.isCancelled()) {
return null;
}
return ctApiDAO.getAuthToken(decryptedLicense);
}
@Override
protected void done() {
AuthTokenResponse authTokenResponse = null;
try {
authTokenResponse = get();
} catch (InterruptedException | CancellationException ex) {
// ignore cancellation
} catch (ExecutionException ex) {
if (ex.getCause() != null && ex.getCause() instanceof CTCloudException cloudEx) {
logger.log(Level.WARNING, "An API error occurred while fetching malware scans information for license", cloudEx);
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
cloudEx.getErrorDetails(),
Bundle.CTMalwareScannerOptionsPanel_MalwareScansFetcher_apiErr_title(),
JOptionPane.ERROR_MESSAGE);
} else {
logger.log(Level.WARNING, "An error occurred while fetching data", ex);
JOptionPane.showMessageDialog(
CTMalwareScannerOptionsPanel.this,
Bundle.CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_desc(),
Bundle.CTMalwareScannerOptionsPanel_MalwareScansFetcher_localErr_title(),
JOptionPane.ERROR_MESSAGE);
}
} finally {
synchronized (CTMalwareScannerOptionsPanel.this) {
CTMalwareScannerOptionsPanel.this.authTokenFetcher = null;
if (!this.isCancelled()) {
setMalwareScansDisplay(authTokenResponse, null);
}
}
}
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel countersResetLabel;
private javax.swing.JLabel fileUploadsRemainingLabel;
private javax.swing.JLabel hashLookupsRemainingLabel;
private javax.swing.JButton licenseInfoAddButton;
private javax.swing.JLabel licenseInfoExpiresLabel;
private javax.swing.JLabel licenseInfoIdLabel;
private javax.swing.JLabel licenseInfoMessageLabel;
private javax.swing.JLabel licenseInfoUserLabel;
private javax.swing.JLabel malwareScansMessageLabel;
private javax.swing.JPanel malwareScansPanel;
private javax.swing.JLabel maxFileUploadsLabel;
private javax.swing.JLabel maxHashLookupsLabel;
private javax.swing.JLabel purchaseFromLabel;
private javax.swing.JLabel purchaseLink;
// End of variables declaration//GEN-END:variables
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="EULADialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[32767, 32767]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[550, 550]"/>
</Property>
<Property name="size" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[550, 550]"/>
</Property>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,40,0,0,2,41"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="viewablePanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="3" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="10" weightX="1.0" weightY="1.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
</Container>
<Container class="javax.swing.JPanel" name="paddingPanel">
<Properties>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[32767, 0]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Container>
<Component class="javax.swing.JButton" name="acceptButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="EULADialog.acceptButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="acceptButtonActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="2" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="5" insetsRight="5" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="cancelButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/ctoptions/ctcloud/Bundle.properties" key="EULADialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,175 @@
/*
* 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.ctoptions.ctcloud;
import java.awt.BorderLayout;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import javafx.application.Platform;
import javafx.concurrent.Worker.State;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import javax.swing.SwingUtilities;
import org.apache.commons.io.IOUtils;
import org.sleuthkit.autopsy.coreutils.Logger;
/**
* Dialog for displaying the Cyber Triage EULA before the license is saved.
*/
class EULADialog extends javax.swing.JDialog {
private static final Logger LOGGER = Logger.getLogger(EULADialog.class.getName());
private static final String EULA_RESOURCE = "EULA.htm";
private boolean acceptPressed = false;
/**
* Creates new form EULADialog
*/
public EULADialog(java.awt.Frame parent, boolean modal) throws IOException {
super(parent, modal);
initComponents();
loadEULA();
}
boolean isAcceptPressed() {
return acceptPressed;
}
private void loadEULA() throws IOException {
InputStream eulaInputStream = EULADialog.class.getResourceAsStream(EULA_RESOURCE);
final String htmlString = IOUtils.toString(eulaInputStream, StandardCharsets.UTF_8);
final JFXPanel fxPanel = new JFXPanel();
this.viewablePanel.add(fxPanel, BorderLayout.CENTER);
Platform.runLater(() -> {
WebView webView = new WebView();
webView.setMaxSize(Short.MAX_VALUE, Short.MAX_VALUE);
webView.setPrefSize(Short.MAX_VALUE, Short.MAX_VALUE);
webView.setMinSize(100, 100);
webView.getEngine().getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
if (newState == State.SUCCEEDED) {
SwingUtilities.invokeLater(() -> EULADialog.this.acceptButton.setEnabled(true));
}
});
webView.getEngine().loadContent(htmlString, "text/html");
VBox root = new VBox(webView);
Scene scene = new Scene(root, Color.RED);
fxPanel.setScene(scene);
});
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
viewablePanel = new javax.swing.JPanel();
javax.swing.JPanel paddingPanel = new javax.swing.JPanel();
acceptButton = new javax.swing.JButton();
javax.swing.JButton cancelButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(org.openide.util.NbBundle.getMessage(EULADialog.class, "EULADialog.title")); // NOI18N
setMaximumSize(new java.awt.Dimension(32767, 32767));
setPreferredSize(new java.awt.Dimension(550, 550));
setSize(new java.awt.Dimension(550, 550));
getContentPane().setLayout(new java.awt.GridBagLayout());
viewablePanel.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
getContentPane().add(viewablePanel, gridBagConstraints);
paddingPanel.setMaximumSize(new java.awt.Dimension(32767, 0));
javax.swing.GroupLayout paddingPanelLayout = new javax.swing.GroupLayout(paddingPanel);
paddingPanel.setLayout(paddingPanelLayout);
paddingPanelLayout.setHorizontalGroup(
paddingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
paddingPanelLayout.setVerticalGroup(
paddingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
getContentPane().add(paddingPanel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(acceptButton, org.openide.util.NbBundle.getMessage(EULADialog.class, "EULADialog.acceptButton.text")); // NOI18N
acceptButton.setEnabled(false);
acceptButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
acceptButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 5);
getContentPane().add(acceptButton, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(EULADialog.class, "EULADialog.cancelButton.text")); // NOI18N
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
getContentPane().add(cancelButton, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
private void acceptButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_acceptButtonActionPerformed
acceptPressed = true;
dispose();
}//GEN-LAST:event_acceptButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton acceptButton;
private javax.swing.JPanel viewablePanel;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,31 @@
/*
* 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.ctoptions.subpanel;
import javax.swing.JPanel;
/**
* A panel to be put in the CyberTriage options.
*/
public abstract class CTOptionsSubPanel extends JPanel {
public abstract void loadSettings();
public abstract void saveSettings();
public abstract boolean valid();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,14 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTIncidentImportOptionsPanel.border.title=Local Settings
CTIncidentImportOptionsPanel.fileRepoPathLabel.text=Update the Cyber Triage Data Folder if you are not using the default location:
CTIncidentImportOptionsPanel.fileRepoPathField.text=
CTIncidentImportOptionsPanel.fileRepoBrowseButton.text=Browse
CTIncidentImportOptionsPanel.caseOpenWarningLabel.text=Some settings cannot be modified while a case is open.
CTIncidentImportOptionsPanel.fileRepoFileChooser.title=Cyber Triage Data Folder
CTIncidentImportOptionsPanel.border.title_1=Incident Importer
CTIncidentImportOptionsPanel.incidentTextLabel.text=The Cyber Triage Incident Import module allows you to open data collected by Cyber Triage in Autopsy. To use this feature you must install the Cyber Triage Import Module.
CTincidentImportOptionsPanel.instructionsTextLabel.text=
CTIncidentImportOptionsPanel.instructionsTextLabel.text=For instructions on obtaining the module refer to:

View File

@ -0,0 +1,14 @@
# Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
# Click nbfs://nbhost/SystemFileSystem/Templates/Other/properties.properties to edit this template
CTIncidentImportOptionsPanel.border.title=Local Settings
CTIncidentImportOptionsPanel.fileRepoPathLabel.text=Update the Cyber Triage Data Folder if you are not using the default location:
CTIncidentImportOptionsPanel.fileRepoPathField.text=
CTIncidentImportOptionsPanel.fileRepoBrowseButton.text=Browse
CTIncidentImportOptionsPanel.caseOpenWarningLabel.text=Some settings cannot be modified while a case is open.
CTIncidentImportOptionsPanel.fileRepoFileChooser.title=Cyber Triage Data Folder
CTIncidentImportOptionsPanel.border.title_1=Incident Importer
CTIncidentImportOptionsPanel.incidentTextLabel.text=The Cyber Triage Incident Import module allows you to open data collected by Cyber Triage in Autopsy. To use this feature you must install the Cyber Triage Import Module.
CTincidentImportOptionsPanel.instructionsTextLabel.text=
CTIncidentImportOptionsPanel.instructionsTextLabel.text=For instructions on obtaining the module refer to:

View File

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Incident Importer">
<ResourceString PropertyName="titleX" bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.border.title_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-50,0,0,1,-17"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="incidentTextPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="incidentTextLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.incidentTextLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="instructionsPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="instructionsTextLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.instructionsTextLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" value="For instructions on obtaining the module refer to:"/>
</AccessibilityProperties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="instructionsLinkLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="getHtmlLink(CT_IMPORTER_DOC_LINK)" type="code"/>
</Property>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Hand Cursor"/>
</Property>
</Properties>
<Events>
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="instructionsLinkLabelMouseClicked"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="repoPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="fileRepoPathLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.fileRepoPathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JTextField" name="fileRepoPathField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.fileRepoPathField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" value=""/>
</AccessibilityProperties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fileRepoPathFieldActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="fileRepoBrowseButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.fileRepoBrowseButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fileRepoBrowseButtonActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="caseOpenWarningLabel">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/incidentoptions/Bundle.properties" key="CTIncidentImportOptionsPanel.caseOpenWarningLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Form>

View File

@ -0,0 +1,288 @@
/** *************************************************************************
** This data and information is proprietary to, and a valuable trade secret
** of, Sleuth Kit Labs. It is given in confidence by Sleuth Kit Labs
** and may only be used as permitted under the license agreement under which
** it has been distributed, and in no other way.
**
** Copyright (c) 2023 Sleuth Kit Labs, LLC. All rights reserved
**
** The technical data and information provided herein are provided with
** `limited rights', and the computer software provided herein is provided
** with `restricted rights' as those terms are defined in DAR and ASPR
** 7-104.9(a).
************************************************************************** */
package com.basistech.df.cybertriage.autopsy.incidentoptions;
import com.basistech.df.cybertriage.autopsy.ctoptions.subpanel.CTOptionsSubPanel;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.commons.lang3.StringUtils;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.guiutils.JFileChooserFactory;
/**
* Options panel for CyberTriage options for importing a CyberTriage incident
*/
@ServiceProvider(service = CTOptionsSubPanel.class)
public class CTIncidentImportOptionsPanel extends CTOptionsSubPanel {
private static final Logger logger = Logger.getLogger(CTIncidentImportOptionsPanel.class.getName());
private static final String CT_IMPORTER_DOC_LINK = "https://docs.cybertriage.com/en/latest/chapters/integrations/autopsy.html";
private final JFileChooserFactory fileRepoChooserFactory = new JFileChooserFactory();
private final CTSettingsPersistence ctPersistence = CTSettingsPersistence.getInstance();
private static String getHtmlLink(String url) {
return "<html><span style=\"color: blue; text-decoration: underline\">" + url + "</span></html>";
}
/**
* Creates new form CTIncidentImportOptionsPanel
*/
public CTIncidentImportOptionsPanel() {
initComponents();
this.fileRepoPathField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
fireSettingsChanged();
}
@Override
public void insertUpdate(DocumentEvent e) {
fireSettingsChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
fireSettingsChanged();
}
});
Case.addEventTypeSubscriber(Collections.singleton(Case.Events.CURRENT_CASE), (evt) -> {
CTIncidentImportOptionsPanel.this.setEnabledItems(evt.getNewValue() != null);
});
}
private void setCTSettingsDisplay(CTSettings ctSettings) {
this.fileRepoPathField.setText(ctSettings.getFileRepoPath());
}
@Override
public synchronized void saveSettings() {
ctPersistence.saveCTSettings(getSettings());
}
@Override
public synchronized void loadSettings() {
CTSettings ctSettings = ctPersistence.loadCTSettings();
setCTSettingsDisplay(ctSettings);
setEnabledItems(Case.isCaseOpen());
}
private void setEnabledItems(boolean caseOpen) {
this.caseOpenWarningLabel.setVisible(caseOpen);
this.fileRepoBrowseButton.setEnabled(!caseOpen);
this.fileRepoPathField.setEnabled(!caseOpen);
}
private void fireSettingsChanged() {
this.firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
private CTSettings getSettings() {
return new CTSettings().setFileRepoPath(this.fileRepoPathField.getText());
}
@Override
public boolean valid() {
return new File(this.fileRepoPathField.getText()).isDirectory();
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
incidentTextPanel = new javax.swing.JPanel();
incidentTextLabel = new javax.swing.JLabel();
instructionsPanel = new javax.swing.JPanel();
instructionsTextLabel = new javax.swing.JLabel();
instructionsLinkLabel = new javax.swing.JLabel();
repoPanel = new javax.swing.JPanel();
javax.swing.JLabel fileRepoPathLabel = new javax.swing.JLabel();
fileRepoPathField = new javax.swing.JTextField();
fileRepoBrowseButton = new javax.swing.JButton();
caseOpenWarningLabel = new javax.swing.JLabel();
setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.border.title_1"))); // NOI18N
setLayout(new java.awt.GridBagLayout());
incidentTextPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(incidentTextLabel, org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.incidentTextLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
incidentTextPanel.add(incidentTextLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
add(incidentTextPanel, gridBagConstraints);
instructionsPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(instructionsTextLabel, org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.instructionsTextLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
instructionsPanel.add(instructionsTextLabel, gridBagConstraints);
instructionsTextLabel.getAccessibleContext().setAccessibleName("For instructions on obtaining the module refer to:");
org.openide.awt.Mnemonics.setLocalizedText(instructionsLinkLabel, getHtmlLink(CT_IMPORTER_DOC_LINK));
instructionsLinkLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
instructionsLinkLabel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
instructionsLinkLabelMouseClicked(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
instructionsPanel.add(instructionsLinkLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(instructionsPanel, gridBagConstraints);
repoPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(fileRepoPathLabel, org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.fileRepoPathLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
repoPanel.add(fileRepoPathLabel, gridBagConstraints);
fileRepoPathField.setText(org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.fileRepoPathField.text")); // NOI18N
fileRepoPathField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fileRepoPathFieldActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
repoPanel.add(fileRepoPathField, gridBagConstraints);
fileRepoPathField.getAccessibleContext().setAccessibleName("");
org.openide.awt.Mnemonics.setLocalizedText(fileRepoBrowseButton, org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.fileRepoBrowseButton.text")); // NOI18N
fileRepoBrowseButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fileRepoBrowseButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
repoPanel.add(fileRepoBrowseButton, gridBagConstraints);
caseOpenWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(caseOpenWarningLabel, org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.caseOpenWarningLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5);
repoPanel.add(caseOpenWarningLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(repoPanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void fileRepoBrowseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileRepoBrowseButtonActionPerformed
JFileChooser fileChooser = fileRepoChooserFactory.getChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setMultiSelectionEnabled(false);
File curSelectedDir = StringUtils.isBlank(this.fileRepoPathField.getText()) ? null : new File(this.fileRepoPathField.getText());
if (curSelectedDir == null || !curSelectedDir.isDirectory()) {
curSelectedDir = new File(CTSettings.getDefaultFileRepoPath());
}
fileChooser.setCurrentDirectory(curSelectedDir);
fileChooser.setDialogTitle(org.openide.util.NbBundle.getMessage(CTIncidentImportOptionsPanel.class, "CTIncidentImportOptionsPanel.fileRepoFileChooser.title"));
int retVal = fileChooser.showOpenDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
this.fileRepoPathField.setText(fileChooser.getSelectedFile().getAbsolutePath());
}
}//GEN-LAST:event_fileRepoBrowseButtonActionPerformed
private void fileRepoPathFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileRepoPathFieldActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_fileRepoPathFieldActionPerformed
private void instructionsLinkLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_instructionsLinkLabelMouseClicked
gotoLink(CT_IMPORTER_DOC_LINK);
}//GEN-LAST:event_instructionsLinkLabelMouseClicked
private void gotoLink(String url) {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException | URISyntaxException e) {
logger.log(Level.SEVERE, "Error opening link to: " + url, e);
}
} else {
logger.log(Level.WARNING, "Desktop API is not supported. Link cannot be opened.");
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel caseOpenWarningLabel;
private javax.swing.JButton fileRepoBrowseButton;
private javax.swing.JTextField fileRepoPathField;
private javax.swing.JLabel incidentTextLabel;
private javax.swing.JPanel incidentTextPanel;
private javax.swing.JLabel instructionsLinkLabel;
private javax.swing.JPanel instructionsPanel;
private javax.swing.JLabel instructionsTextLabel;
private javax.swing.JPanel repoPanel;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,72 @@
/** *************************************************************************
** This data and information is proprietary to, and a valuable trade secret
** of, Sleuth Kit Labs. It is given in confidence by Sleuth Kit Labs
** and may only be used as permitted under the license agreement under which
** it has been distributed, and in no other way.
**
** Copyright (c) 2023 Sleuth Kit Labs, LLC. All rights reserved
**
** The technical data and information provided herein are provided with
** `limited rights', and the computer software provided herein is provided
** with `restricted rights' as those terms are defined in DAR and ASPR
** 7-104.9(a).
************************************************************************** */
package com.basistech.df.cybertriage.autopsy.incidentoptions;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.modules.Places;
/**
* CT settings that don't include license information. This code must be kept in-sync with code in
* CT Autopsy Importer NBM.
*/
public class CTSettings {
private static final String DEFAULT_FILE_REPO_PATH = getAppDataLocalDirectory();
// taken from com.basistech.df.cybertriage.utils.SystemProperties
private static String getAppDataLocalDirectory() {
Logger LOGGER = java.util.logging.Logger.getLogger(CTSettings.class.getCanonicalName());
if (Objects.nonNull(Places.getUserDirectory()) && Places.getUserDirectory().getAbsolutePath().endsWith("testuserdir")) { // APP is in testing .. this should return the test path
LOGGER.log(Level.INFO, "Application Data (test mode) Path: " + Places.getUserDirectory().getAbsolutePath());
return Places.getUserDirectory().getAbsolutePath();
} else {
Path localAppPath = Paths.get(System.getenv("LOCALAPPDATA"), "cybertriage");
try {
Files.createDirectories(localAppPath);
LOGGER.log(Level.INFO, "Application Data Path: " + localAppPath.toString());
return localAppPath.toString();
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, "IO Error, defaulting to user dir", ex);
return Places.getUserDirectory().getAbsolutePath(); // In case of an IO Error
}
}
}
public static String getDefaultFileRepoPath() {
return DEFAULT_FILE_REPO_PATH;
}
static CTSettings getDefaultSettings() {
return new CTSettings()
.setFileRepoPath(DEFAULT_FILE_REPO_PATH);
}
private String fileRepoPath = DEFAULT_FILE_REPO_PATH;
public String getFileRepoPath() {
return fileRepoPath;
}
public CTSettings setFileRepoPath(String fileRepoPath) {
this.fileRepoPath = fileRepoPath;
return this;
}
}

View File

@ -0,0 +1,80 @@
/** *************************************************************************
** This data and information is proprietary to, and a valuable trade secret
** of, Sleuth Kit Labs. It is given in confidence by Sleuth Kit Labs
** and may only be used as permitted under the license agreement under which
** it has been distributed, and in no other way.
**
** Copyright (c) 2023 Sleuth Kit Labs, LLC. All rights reserved
**
** The technical data and information provided herein are provided with
** `limited rights', and the computer software provided herein is provided
** with `restricted rights' as those terms are defined in DAR and ASPR
** 7-104.9(a).
************************************************************************** */
package com.basistech.df.cybertriage.autopsy.incidentoptions;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
/**
* Handles persisting CT Settings. This code must be kept in-sync with code in
* CT Autopsy Importer NBM.
*/
public class CTSettingsPersistence {
private static final String CT_SETTINGS_DIR = "CyberTriage";
private static final String CT_SETTINGS_FILENAME = "CyberTriageSettings.json";
private static final Logger logger = Logger.getLogger(CTSettingsPersistence.class.getName());
private static final CTSettingsPersistence instance = new CTSettingsPersistence();
private final ObjectMapper objectMapper = new ObjectMapper();
public static CTSettingsPersistence getInstance() {
return instance;
}
public synchronized boolean saveCTSettings(CTSettings ctSettings) {
if (ctSettings != null) {
File settingsFile = getCTSettingsFile();
settingsFile.getParentFile().mkdirs();
try {
objectMapper.writeValue(settingsFile, ctSettings);
return true;
} catch (IOException ex) {
logger.log(Level.WARNING, "There was an error writing CyberTriage settings to file: " + settingsFile.getAbsolutePath(), ex);
}
}
return false;
}
public synchronized CTSettings loadCTSettings() {
CTSettings settings = null;
File settingsFile = getCTSettingsFile();
if (settingsFile.isFile()) {
try {
settings = objectMapper.readValue(settingsFile, CTSettings.class);
} catch (IOException ex) {
logger.log(Level.WARNING, "There was an error reading CyberTriage settings to file: " + settingsFile.getAbsolutePath(), ex);
}
}
return settings == null
? CTSettings.getDefaultSettings()
: settings;
}
private File getCTSettingsFile() {
return Paths.get(PlatformUtil.getModuleConfigDirectory(), CT_SETTINGS_DIR, CT_SETTINGS_FILENAME).toFile();
}
}

View File

@ -0,0 +1,84 @@
/*
* 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.malwarescan;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
* Processes a batch when number of items reaches batchSize or flush. Processing
* blocks (and subsequently add and flush operations) until previous batch
* finishes.
*/
class BatchProcessor<T> {
private ExecutorService processingExecutorService = Executors.newSingleThreadExecutor();
private final BlockingQueue<T> batchingQueue;
private final int batchSize;
private final Consumer<List<T>> itemsConsumer;
private final long secondsTimeout;
public BatchProcessor(int batchSize, long secondsTimeout, Consumer<List<T>> itemsConsumer) {
this.batchingQueue = new LinkedBlockingQueue<>(batchSize);
this.batchSize = batchSize;
this.itemsConsumer = itemsConsumer;
this.secondsTimeout = secondsTimeout;
}
public synchronized void add(T item) throws InterruptedException {
batchingQueue.add(item);
if (batchingQueue.size() >= batchSize) {
asyncProcessBatch();
}
}
public synchronized void flushAndReset() throws InterruptedException {
// get any remaining
asyncProcessBatch();
// don't accept any new additions
processingExecutorService.shutdown();
// await termination
processingExecutorService.awaitTermination(secondsTimeout, TimeUnit.SECONDS);
// get new (not shut down executor)
processingExecutorService = Executors.newSingleThreadExecutor();
}
private synchronized void asyncProcessBatch() throws InterruptedException {
if (!batchingQueue.isEmpty()) {
final List<T> processingList = new ArrayList<>();
// transfer batching queue to processing queue
batchingQueue.drainTo(processingList);
// submit to be processed
processingExecutorService.submit(() -> itemsConsumer.accept(processingList));
}
}
}

View File

@ -0,0 +1,7 @@
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.AccessibleContext.accessibleName=Upload file content for files that do not have results
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.label=Upload file content for files that do not have results
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.text=Upload file content for files that do not have results
DataSourceIntegrityIngestSettingsPanel.queryFilesTextArea.text=Query for existing results using file\u2019s hash
MalwareScanIngestSettingsPanel.ingestSettingsLabel.text=Ingest Settings
MalwareScanIngestSettingsPanel.paidLicenseTextArea.text=This module requires a paid license. \nSee the Global Options panel for details
MalwareScanIngestSettingsPanel.queryFilesCheckbox.text=Query for existing results using file\u2019s hash

View File

@ -0,0 +1,50 @@
MalwareScanIngestModule_longPollForNotFound_fileLookupPolling_desc=Waiting for all uploaded files to complete scanning.
MalwareScanIngestModule_longPollForNotFound_fileLookupPolling_title=Waiting for File Upload Results
MalwareScanIngestModule_longPollForNotFound_timeout_desc=There was a timeout while waiting for file uploads to be processed. Please try again later.
MalwareScanIngestModule_longPollForNotFound_timeout_title=File Upload Results Timeout
MalwareScanIngestModule_malwareTypeDisplayName=Malware
# {0} - errorResponse
MalwareScanIngestModule_SharedProcessing_authTokenResponseError_desc=Received error: ''{0}'' when fetching the API authentication token for the license
MalwareScanIngestModule_SharedProcessing_authTokenResponseError_title=Authentication API error
MalwareScanIngestModule_SharedProcessing_createAnalysisResult_No=NO
MalwareScanIngestModule_SharedProcessing_createAnalysisResult_Yes=YES
MalwareScanIngestModule_SharedProcessing_exhaustedHashLookups_desc=The remaining hash lookups for this license have been exhausted
MalwareScanIngestModule_SharedProcessing_exhaustedHashLookups_title=Hash Lookups Exhausted
MalwareScanIngestModule_SharedProcessing_exhaustedResultsHashLookups_desc=Not all files were processed because hash lookup limits were exceeded. Please try again when your limits reset.
MalwareScanIngestModule_SharedProcessing_exhaustedResultsHashLookups_title=Lookup Limits Exceeded
MalwareScanIngestModule_SharedProcessing_flushTimeout_desc=A timeout occurred while finishing processing
MalwareScanIngestModule_SharedProcessing_flushTimeout_title=Processing Timeout
MalwareScanIngestModule_SharedProcessing_generalProcessingError_desc=An error occurred while processing hash lookup results
MalwareScanIngestModule_SharedProcessing_generalProcessingError_title=Hash Lookup Error
# {0} - errorResponse
MalwareScanIngestModule_SharedProcessing_repServicenResponseError_desc=Received error: ''{0}'' when fetching hash lookup results
MalwareScanIngestModule_SharedProcessing_repServicenResponseError_title=Lookup API error
MalwareScanIngestModule_ShareProcessing_batchTimeout_desc=Batch processing timed out
MalwareScanIngestModule_ShareProcessing_batchTimeout_title=Batch Processing Timeout
# {0} - remainingLookups
MalwareScanIngestModule_ShareProcessing_lowLookupsLimitWarning_desc=This license only has {0} lookups remaining.
MalwareScanIngestModule_ShareProcessing_lowLookupsLimitWarning_title=Hash Lookups Low
# {0} - remainingUploads
MalwareScanIngestModule_ShareProcessing_lowUploadsLimitWarning_desc=This license only has {0} file uploads remaining.
MalwareScanIngestModule_ShareProcessing_lowUploadsLimitWarning_title=File Uploads Limit Low
MalwareScanIngestModule_ShareProcessing_noLicense_desc=No Cyber Triage license could be loaded. Cyber Triage processing will be disabled.
MalwareScanIngestModule_ShareProcessing_noLicense_title=No Cyber Triage License
MalwareScanIngestModule_ShareProcessing_noLookupsRemaining_desc=There are no more remaining hash lookups for this license at this time. Malware scanning will be disabled.
MalwareScanIngestModule_ShareProcessing_noLookupsRemaining_title=No remaining lookups
MalwareScanIngestModule_ShareProcessing_noUploadsRemaining_desc=There are no more remaining file uploads for this license at this time. File uploading will be disabled.
MalwareScanIngestModule_ShareProcessing_noUploadsRemaining_title=No remaining file uploads
MalwareScanIngestModule_uploadFile_noRemainingFileUploads_desc=There are no more file uploads on this license at this time. File uploads will be disabled for remaining uploads.
MalwareScanIngestModule_uploadFile_noRemainingFileUploads_title=No Remaining File Uploads
# {0} - objectId
MalwareScanIngestModule_uploadFile_notUploadable_desc=A file did not meet requirements for upload (object id: {0}).
MalwareScanIngestModule_uploadFile_notUploadable_title=Not Able to Upload
MalwareScanIngestModuleFactory_description=Identifies executable files with malware.
MalwareScanIngestModuleFactory_displayName=Cyber Triage Malware Scanner
MalwareScanIngestModuleFactory_version=1.0.0
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.AccessibleContext.accessibleName=Upload file content for files that do not have results
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.label=Upload file content for files that do not have results
MalwareScanIngestSettingsPanel.uploadFilesCheckbox.text=Upload file content for files that do not have results
DataSourceIntegrityIngestSettingsPanel.queryFilesTextArea.text=Query for existing results using file\u2019s hash
MalwareScanIngestSettingsPanel.ingestSettingsLabel.text=Ingest Settings
MalwareScanIngestSettingsPanel.paidLicenseTextArea.text=This module requires a paid license. \nSee the Global Options panel for details
MalwareScanIngestSettingsPanel.queryFilesCheckbox.text=Query for existing results using file\u2019s hash

View File

@ -0,0 +1,105 @@
/*
* 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.malwarescan;
import com.basistech.df.cybertriage.autopsy.ctoptions.CTOptionsPanel;
import org.openide.util.NbBundle.Messages;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.ingest.FileIngestModule;
import org.sleuthkit.autopsy.ingest.IngestModuleFactoryAdapter;
import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel;
import org.sleuthkit.autopsy.ingest.NoIngestModuleIngestJobSettings;
/**
* Factory for malware scan ingest modules.
*/
@ServiceProvider(service = org.sleuthkit.autopsy.ingest.IngestModuleFactory.class)
@Messages({
"MalwareScanIngestModuleFactory_displayName=Cyber Triage Malware Scanner",
"MalwareScanIngestModuleFactory_description=Identifies executable files with malware.",
"MalwareScanIngestModuleFactory_version=1.0.0"
})
public class MalwareScanIngestModuleFactory extends IngestModuleFactoryAdapter {
/**
* @return The display name for the factory (static method).
*/
public static String getDisplayName() {
return Bundle.MalwareScanIngestModuleFactory_displayName();
}
@Override
public String getModuleDisplayName() {
return MalwareScanIngestModuleFactory.getDisplayName();
}
@Override
public String getModuleDescription() {
return Bundle.MalwareScanIngestModuleFactory_description();
}
@Override
public String getModuleVersionNumber() {
return Bundle.MalwareScanIngestModuleFactory_version();
}
@Override
public boolean isFileIngestModuleFactory() {
return true;
}
@Override
public FileIngestModule createFileIngestModule(IngestModuleIngestJobSettings ingestOptions) {
return new MalwareScanIngestModule((MalwareScanIngestSettings) ingestOptions);
}
@Override
public boolean hasGlobalSettingsPanel() {
return true;
}
@Override
public IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() {
CTOptionsPanel optionsPanel = new CTOptionsPanel();
optionsPanel.loadSavedSettings();
return optionsPanel;
}
@Override
public boolean hasIngestJobSettingsPanel() {
return true;
}
@Override
public IngestModuleIngestJobSettingsPanel getIngestJobSettingsPanel(IngestModuleIngestJobSettings settings) {
if (settings instanceof MalwareScanIngestSettings) {
return new MalwareScanIngestSettingsPanel((MalwareScanIngestSettings) settings);
}
/*
* Compatibility check for older versions.
*/
if (settings instanceof NoIngestModuleIngestJobSettings) {
return new MalwareScanIngestSettingsPanel(new MalwareScanIngestSettings());
}
throw new IllegalArgumentException("Expected settings argument to be an instance of IngestSettings");
}
}

View File

@ -0,0 +1,96 @@
/*
* 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.malwarescan;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings;
/**
* Ingest job settings for the Malware scanner module.
*/
final class MalwareScanIngestSettings implements IngestModuleIngestJobSettings {
private static final long serialVersionUID = 1L;
private static final boolean DEFAULT_QUERY_FILES = true;
private static final boolean DEFAULT_UPLOAD_FILES = true;
public boolean queryFiles;
public boolean uploadFiles;
/**
* Instantiate the ingest job settings with default values.
*/
MalwareScanIngestSettings() {
this.queryFiles = DEFAULT_QUERY_FILES;
this.uploadFiles = DEFAULT_UPLOAD_FILES;
}
/**
* Instantiate the ingest job settings.
*
* @param computeHashes Compute hashes if none are present
* @param verifyHashes Verify hashes if any are present
*/
MalwareScanIngestSettings(boolean queryFiles, boolean uploadFiles) {
this.queryFiles = queryFiles;
this.uploadFiles = uploadFiles;
}
@Override
public long getVersionNumber() {
return serialVersionUID;
}
/**
* Should files be queried?
*
* @return true if files should be queried, false otherwise
*/
public boolean shouldQueryFiles() {
return queryFiles;
}
/**
* Set whether files should be queried.
*
* @param queryFiles true if files should be queried
*/
void setqueryFiles(boolean queryFiles) {
this.queryFiles = queryFiles;
}
/**
* Should files be uploaded?
*
* @return true if files should be uploaded, false otherwise
*/
public boolean shouldUploadFiles() {
return uploadFiles;
}
/**
* Set whether files should be uploaded.
*
* @param uploadFiles true if files should be uploaded
*/
void setUploadFiles(boolean uploadFiles) {
this.uploadFiles = uploadFiles;
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 155]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="6" pref="6" max="-2" attributes="0"/>
<Component id="ingestSettingsLabel" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<EmptySpace min="6" pref="6" max="-2" attributes="0"/>
<Component id="uploadFilesCheckbox" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="queryFilesCheckbox" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="paidLicenseTextArea" min="-2" pref="243" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace min="-2" pref="185" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="ingestSettingsLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
<Component id="queryFilesCheckbox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="uploadFilesCheckbox" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
<Component id="paidLicenseTextArea" min="-2" pref="32" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="queryFilesCheckbox">
<Properties>
<Property name="selected" type="boolean" value="true"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.queryFilesCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="uploadFilesCheckbox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.uploadFilesCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="label" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.uploadFilesCheckbox.label" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.uploadFilesCheckbox.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</AccessibilityProperties>
</Component>
<Component class="javax.swing.JLabel" name="ingestSettingsLabel">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
<FontInfo relative="true">
<Font bold="true" component="ingestSettingsLabel" property="font" relativeSize="true" size="0"/>
</FontInfo>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.ingestSettingsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextArea" name="paidLicenseTextArea">
<Properties>
<Property name="columns" type="int" value="20"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Segoe UI" size="12" style="1"/>
</Property>
<Property name="rows" type="int" value="5"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/basistech/df/cybertriage/autopsy/malwarescan/Bundle.properties" key="MalwareScanIngestSettingsPanel.paidLicenseTextArea.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="wrapStyleWord" type="boolean" value="true"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="null"/>
</Property>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="opaque" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,149 @@
/*
* Autopsy 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.malwarescan;
import com.basistech.df.cybertriage.autopsy.ctapi.json.LicenseInfo;
import com.basistech.df.cybertriage.autopsy.ctoptions.ctcloud.CTLicensePersistence;
import java.util.Optional;
import org.sleuthkit.autopsy.modules.dataSourceIntegrity.*;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel;
/**
* Ingest job settings panel for the Malware scanner ingest.
*/
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
final class MalwareScanIngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
private final CTLicensePersistence ctPersistence = CTLicensePersistence.getInstance();
MalwareScanIngestSettingsPanel(MalwareScanIngestSettings settings) {
initComponents();
customizeComponents(settings);
}
/**
* Update components with values from the ingest job settings.
*
* @param settings The ingest job settings.
*/
private void customizeComponents(MalwareScanIngestSettings settings) {
Optional<LicenseInfo> licenseInfoOpt = ctPersistence.loadLicenseInfo();
LicenseInfo licenseInfo = licenseInfoOpt.orElse(null);
if (licenseInfo != null) {
this.paidLicenseTextArea.setVisible(false);
this.queryFilesCheckbox.setVisible(true);
this.queryFilesCheckbox.setEnabled(false);
this.uploadFilesCheckbox.setVisible(true);
this.queryFilesCheckbox.setSelected(true);
this.uploadFilesCheckbox.setSelected(settings.shouldUploadFiles());
} else {
this.paidLicenseTextArea.setVisible(true);
this.queryFilesCheckbox.setVisible(false);
this.uploadFilesCheckbox.setVisible(false);
}
}
@Override
public IngestModuleIngestJobSettings getSettings() {
return new MalwareScanIngestSettings(queryFilesCheckbox.isSelected(), uploadFilesCheckbox.isSelected());
}
/**
* 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
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
queryFilesCheckbox = new javax.swing.JCheckBox();
uploadFilesCheckbox = new javax.swing.JCheckBox();
ingestSettingsLabel = new javax.swing.JLabel();
paidLicenseTextArea = new javax.swing.JTextArea();
setPreferredSize(new java.awt.Dimension(300, 155));
queryFilesCheckbox.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(queryFilesCheckbox, org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.queryFilesCheckbox.text")); // NOI18N
queryFilesCheckbox.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(uploadFilesCheckbox, org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.uploadFilesCheckbox.text")); // NOI18N
uploadFilesCheckbox.setFocusable(false);
uploadFilesCheckbox.setLabel(org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.uploadFilesCheckbox.label")); // NOI18N
ingestSettingsLabel.setFont(ingestSettingsLabel.getFont().deriveFont(ingestSettingsLabel.getFont().getStyle() | java.awt.Font.BOLD));
org.openide.awt.Mnemonics.setLocalizedText(ingestSettingsLabel, org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.ingestSettingsLabel.text")); // NOI18N
paidLicenseTextArea.setColumns(20);
paidLicenseTextArea.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
paidLicenseTextArea.setRows(5);
paidLicenseTextArea.setText(org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.paidLicenseTextArea.text")); // NOI18N
paidLicenseTextArea.setWrapStyleWord(true);
paidLicenseTextArea.setBorder(null);
paidLicenseTextArea.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
paidLicenseTextArea.setFocusable(false);
paidLicenseTextArea.setOpaque(false);
paidLicenseTextArea.setRequestFocusEnabled(false);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(ingestSettingsLabel))
.addGroup(layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(uploadFilesCheckbox))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(queryFilesCheckbox))
.addGroup(layout.createSequentialGroup()
.addGap(5, 5, 5)
.addComponent(paidLicenseTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, 243, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(185, 185, 185))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(ingestSettingsLabel)
.addGap(18, 18, 18)
.addComponent(queryFilesCheckbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(uploadFilesCheckbox)
.addGap(18, 18, 18)
.addComponent(paidLicenseTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE))
);
uploadFilesCheckbox.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(MalwareScanIngestSettingsPanel.class, "MalwareScanIngestSettingsPanel.uploadFilesCheckbox.AccessibleContext.accessibleName")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel ingestSettingsLabel;
private javax.swing.JTextArea paidLicenseTextArea;
private javax.swing.JCheckBox queryFilesCheckbox;
private javax.swing.JCheckBox uploadFilesCheckbox;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,201 @@
/*
* 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.malwarescan;
import com.google.common.net.InetAddresses;
import java.net.InetAddress;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
/**
* Utility class to anonymize paths.
*/
class PathNormalizer {
private static final Logger LOGGER = Logger.getLogger(PathNormalizer.class.getName());
private static final String ANONYMIZED_USERNAME = "<user>";
private static final String ANONYMIZED_IP = "<private_ip>";
private static final String ANONYMIZED_HOSTNAME = "<hostname>";
private static final String FORWARD_SLASH = "/";
private static final String BACK_SLASH = "\\";
private static final Pattern USER_PATH_FORWARD_SLASH_REGEX = Pattern.compile("(?<!all )([/]{0,1}\\Qusers\\E/)(?!(public|Default|defaultAccount|All Users))([^/]+)(/){0,1}", Pattern.CASE_INSENSITIVE);
private static final Pattern USER_PATH_BACK_SLASH_REGEX = Pattern.compile("(?<!all )([\\\\]{0,1}\\Qusers\\E\\\\)(?!(public|Default|defaultAccount|All Users))([^\\\\]+)([\\\\]){0,1}", Pattern.CASE_INSENSITIVE);
private static final Pattern USER_PATH_FORWARD_SLASH_REGEX_XP = Pattern.compile("([/]{0,1}\\Qdocuments and settings\\E/)(?!(Default User|All Users))([^/]+)(/){0,1}", Pattern.CASE_INSENSITIVE);
private static final Pattern USER_PATH_BACK_SLASH_REGEX_XP = Pattern.compile("([\\\\]{0,1}\\Qdocuments and settings\\E\\\\)(?!(Default User|All Users))([^\\\\]+)(\\\\){0,1}", Pattern.CASE_INSENSITIVE);
private static final Pattern UNC_PATH_FORWARD_SLASH_PATTERN = Pattern.compile("(//)([^/]+)(/){0,1}");
private static final Pattern UNC_PATH_BACK_SLASH_PATTERN = Pattern.compile("(\\\\\\\\)([^\\\\]+)(\\\\){0,1}");
private static final String USERNAME_REGEX_REPLACEMENT = "$1" + ANONYMIZED_USERNAME + "$4";
private final SleuthkitCase skCase;
PathNormalizer(SleuthkitCase skCase) {
this.skCase = skCase;
}
protected List<String> getUsernames() {
try {
return this.skCase.getOsAccountManager().getOsAccounts().stream()
.filter(acct -> acct != null)
.map(acct -> acct.getLoginName().orElse(null))
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
} catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "There was an error getting current os accounts", ex);
return Collections.emptyList();
}
}
public String normalizePath(String inputString) {
if (StringUtils.isBlank(inputString)) {
return "";
}
String anonymousString = anonymizeUserFromPathsWithForwardSlashes(inputString);
anonymousString = anonymizeUserFromPathsWithBackSlashes(anonymousString);
anonymousString = anonymizeServerFromUNCPath(anonymousString);
return anonymousString;
}
private String anonymizeUserFromPathsWithForwardSlashes(String stringWithUsername) {
String anonymousString = stringWithUsername;
anonymousString = regexReplace(anonymousString, USER_PATH_FORWARD_SLASH_REGEX_XP, USERNAME_REGEX_REPLACEMENT);
anonymousString = regexReplace(anonymousString, USER_PATH_FORWARD_SLASH_REGEX, USERNAME_REGEX_REPLACEMENT);
anonymousString = replaceFolder(anonymousString, getUsernames(), ANONYMIZED_USERNAME, FORWARD_SLASH);
return anonymousString;
}
// Most paths in CyberTriage are normalized with forward slashes
// but there can still be strings containing paths that are not normalized such paths contained in arguments or event log payloads
private String anonymizeUserFromPathsWithBackSlashes(String stringWithUsername) {
String anonymousString = stringWithUsername;
anonymousString = regexReplace(anonymousString, USER_PATH_BACK_SLASH_REGEX_XP, USERNAME_REGEX_REPLACEMENT);
anonymousString = regexReplace(anonymousString, USER_PATH_BACK_SLASH_REGEX, USERNAME_REGEX_REPLACEMENT);
anonymousString = replaceFolder(anonymousString, getUsernames(), ANONYMIZED_USERNAME, BACK_SLASH);
return anonymousString;
}
private String anonymizeServerFromUNCPath(String inputString) {
Set<String> serverNames = new HashSet<>();
String anonymousString = inputString.toLowerCase(Locale.ENGLISH);
Matcher forwardSlashMatcher = UNC_PATH_FORWARD_SLASH_PATTERN.matcher(anonymousString);
while (forwardSlashMatcher.find()) {
String serverName = forwardSlashMatcher.group(2);
serverNames.add(serverName);
}
Matcher backSlashMatcher = UNC_PATH_BACK_SLASH_PATTERN.matcher(anonymousString);
while (backSlashMatcher.find()) {
String serverName = backSlashMatcher.group(2);
serverNames.add(serverName);
}
for (String serverName : serverNames) {
if (StringUtils.isBlank(serverName)) {
continue;
}
if (InetAddresses.isInetAddress(serverName) && isLocalIP(serverName)) {
anonymousString = replaceFolder(anonymousString, Collections.singletonList(serverName), ANONYMIZED_IP);
} else {
anonymousString = replaceFolder(anonymousString, Collections.singletonList(serverName), ANONYMIZED_HOSTNAME);
}
}
return anonymousString;
}
private static String regexReplace(String orig, Pattern pattern, String regexReplacement) {
Matcher matcher = pattern.matcher(orig);
return matcher.replaceAll(regexReplacement);
}
private static String replaceFolder(String orig, List<String> valuesToReplace, String replacementValue) {
String anonymized = orig;
anonymized = replaceFolder(anonymized, valuesToReplace, replacementValue, FORWARD_SLASH);
anonymized = replaceFolder(anonymized, valuesToReplace, replacementValue, BACK_SLASH);
return anonymized;
}
private static String replaceFolder(String orig, List<String> valuesToReplace, String replacementValue, String folderDelimiter) {
if (orig == null || valuesToReplace == null) {
return orig;
}
String anonymousString = orig;
// ensure non-null
folderDelimiter = StringUtils.defaultString(folderDelimiter);
replacementValue = StringUtils.defaultString(replacementValue);
// replace
for (String valueToReplace : valuesToReplace) {
if (StringUtils.isNotEmpty(valueToReplace)) {
anonymousString = StringUtils.replace(anonymousString,
folderDelimiter + valueToReplace + folderDelimiter,
folderDelimiter + replacementValue + folderDelimiter);
}
}
return anonymousString;
}
/**
* Returns true if IP Address is Any Local / Site Local / Link Local / Loop
* back local. Sample list "0.0.0.0", wildcard addres
* "10.1.1.1","10.10.10.10", site local address "127.0.0.0","127.2.2.2",
* loopback address "169.254.0.0","169.254.10.10", Link local address
* "172.16.0.0","172.31.245.245", site local address
*
* @param ipAddress
* @return
*/
public static boolean isLocalIP(String ipAddress) {
try {
InetAddress a = InetAddresses.forString(ipAddress);
return a.isAnyLocalAddress() || a.isSiteLocalAddress()
|| a.isLoopbackAddress() || a.isLinkLocalAddress();
} catch (IllegalArgumentException ex) {
LOGGER.log(Level.WARNING, "Invalid IP string", ex);
return false;
}
}
}

View File

@ -0,0 +1,99 @@
AddBlackboardArtifactTagAction.pluralTagResult=Agregar etiquetas de resultado
AddBlackboardArtifactTagAction.singularTagResult=Agregar etiqueta de resultado
AddBlackboardArtifactTagAction.taggingErr=Error de etiquetado
# {0} - artifactName
AddBlackboardArtifactTagAction.unableToTag.msg=No se puede etiquetar {0}.
AddContentTagAction.cannotApplyTagErr=No se puede aplicar etiqueta
AddContentTagAction.pluralTagFile=Agregar etiquetas de archivo
AddContentTagAction.singularTagFile=Agregar etiqueta de archivo
# {0} - fileName
# {1} - tagName
AddContentTagAction.tagExists={0} ha sido etiquetado como {1}. No se puede volver a aplicar la misma etiqueta.
AddContentTagAction.taggingErr=Error de etiquetado
# {0} - fileName
AddContentTagAction.unableToTag.msg=Incapaz de etiquetar {0}, no es un archivo regular.
# {0} - fileName
AddContentTagAction.unableToTag.msg2=Incapaz de etiquetar {0}.
CTL_DumpThreadAction=Volcado de hilo
CTL_ShowIngestProgressSnapshotAction=Detalles del estado de ingestion
DeleteBlackboardArtifactTagAction.deleteTag=Eliminar etiqueta(s) seleccionada(s)
DeleteBlackboardArtifactTagAction.tagDelErr=Error de eliminacion de etiqueta
# {0} - tagName
DeleteBlackboardArtifactTagAction.unableToDelTag.msg=Incapaz de eliminar la etiqueta {0}.
DeleteContentTagAction.deleteTag=Eliminar etiqueta(s) seleccionada(s)
DeleteContentTagAction.tagDelErr=Error de eliminacion de etiqueta
# {0} - tagName
DeleteContentTagAction.unableToDelTag.msg=Incapaz de eliminar la etiqueta {0}.
DeleteFileBlackboardArtifactTagAction.deleteTag=Eliminar etiqueta de resultado
# {0} - artifactID
DeleteFileBlackboardArtifactTagAction.deleteTag.alert=Incapaz de desetiquetar artefacto {0}.
# {0} - artifactID
DeleteFileBlackboardArtifactTagAction.deleteTags.alert=Incapaz de desetiquetar artefacto {0}.
DeleteFileContentTagAction.deleteTag=Eliminar Etiqueta de Archivo
# {0} - fileID
DeleteFileContentTagAction.deleteTag.alert=No se puede desetiquetar archivo {0}.
ExitAction.confirmationDialog.message=Ingestion esta en curso, estas seguro/a de que quieres salir?
ExitAction.confirmationDialog.title=Ingestion en Curso
# {0} - exception message
ExitAction.messageBox.caseCloseExceptionMessage=Error closing case: {0}
GetTagNameDialog.descriptionLabel.text=Descripcion:
GetTagNameDialog.notableCheckbox.text=Tag indica que el item es notable.
GetTagNameDialog.tagDescriptionIllegalCharacters.message=Las descripciones de tags no pueden contener comas (,) o puntos y comas (;)
GetTagNameDialog.tagDescriptionIllegalCharacters.title=Caracter no valido en la descripcion del tag
GetTagNameDialog.tagNameAlreadyExists.message=El nombre del tag debe ser unico. Un tag con este nombre ya existe.
GetTagNameDialog.tagNameAlreadyExists.title=Nombre de Tag Duplicado
GetTagNameDialog.tagNameField.text=
GetTagNameDialog.cancelButton.text=Cancelar
GetTagNameDialog.okButton.text=OK
GetTagNameDialog.preexistingLabel.text=Nombres de Tags Preexistentes:
GetTagNameDialog.newTagPanel.border.title=Nuevo Tag
GetTagNameDialog.tagNameLabel.text=Nombre de etiqueta:
GetTagNameAndCommentDialog.newTagButton.text=Nueva Etiqueta
GetTagNameAndCommentDialog.okButton.text=OK
GetTagNameAndCommentDialog.commentText.toolTipText=Ingresa un comentario opcional para la etiqueta o dejalo en blanco
GetTagNameAndCommentDialog.commentText.text=
GetTagNameAndCommentDialog.commentLabel.text=Comentario:
# To change this template, choose Tools | Templates
# and open the template in the editor.
GetTagNameAndCommentDialog.cancelButton.text=Cancelar
GetTagNameAndCommentDialog.tagLabel.text=Etiqueta:
AddTagAction.bookmarkFile=Guardar archivo como marcador
AddTagAction.quickTag=Etiqueta Rapida
AddTagAction.noTags=Sin etiquetas
AddTagAction.newTag=Nueva Etiqueta...
AddTagAction.tagAndComment=Etiqueta y Comentario...
AddBookmarkTagAction.bookmark.text=Marcador
GetTagNameAndCommentDialog.noTags=Sin Etiquetas
GetTagNameAndCommentDialog.selectTag=Seleccionar Etiqueta
GetTagNameAndCommentDialog.cancelName=Cancelar
GetTagNameDialog.createTag=Crear Etiqueta
GetTagNameDialog.cancelName=Cancelar
GetTagNameDialog.mustSupplyTtagName.msg=Debes suministrar un nombre de etiqueta para continuar.
GetTagNameDialog.tagNameErr=Nombre de etiqueta.
GetTagNameDialog.illegalChars.msg=El nombre de etiqueta contiene caracteres no permitidos.\nNo puede contener ninguno de los siguientes simbolos: \\ : * ? " < > | , ;
GetTagNameDialog.illegalCharsErr=Caracteres no permitidos.
GetTagNameDialog.unableToAddTagNameToCase.msg=Incapaz de agregar el nombre de etiqueta {0} al caso.
GetTagNameDialog.taggingErr=Error de etiquetado
GetTagNameDialog.tagNameAlreadyDef.msg=Se ha definido previamente un nombre de etiqueta {0}.
GetTagNameDialog.dupTagErr=Error de etiqueta duplicada
GetTagNameDialog.tagNameExistsTskCore.msg=El nombre de etiqueta {0} ya existe en la base de datos, pero ocurrio un error al recuperarlo.
OpenLogFolder.error1=Archivo de registro no encontrado: {0}
OpenLogFolder.CouldNotOpenLogFolder=No se pudo abrir la carpeta de registros
CTL_OpenLogFolder=Abrir carpeta de registros
CTL_OpenOutputFolder=Abrir carpeta de casos
OpenOutputFolder.error1=Carpeta del Caso No Encontrada: {0}
OpenOutputFolder.noCaseOpen=No hay caso abierto, por lo tanto, no hay carpeta de caso actual disponible.
OpenOutputFolder.CouldNotOpenOutputFolder=No es posible abrir carepta de casos
# {0} - old tag name
# {1} - artifactID
ReplaceBlackboardArtifactTagAction.replaceTag.alert=Incapaz de reemplazar etiqueta {0} por el artefacto {1}.
# {0} - old tag name
# {1} - content obj id
ReplaceContentTagAction.replaceTag.alert=Incapaz de reemplazar etiqueta {0} por {1}.
ReplaceTagAction.replaceTag=Reemplazar Etiqueta(s) Seleccionada(s) Con
ShowIngestProgressSnapshotAction.actionName.text=Obten una Instantanea del Progreso de Ingesta
OpenPythonModulesFolderAction.actionName.text=Python Plugins
OpenPythonModulesFolderAction.errorMsg.folderNotFound=Carpeta de complementos de Python no encontrada: {0}
CTL_OpenPythonModulesFolderAction=Python Plugins
GetTagNameAndCommentDialog.tagCombo.toolTipText=Seleccionar etiqueta para usar
CTL_ExitAction=Salir

View File

@ -0,0 +1,48 @@
AllCasesSearchAction.getName.text=Busqueda Repositorio Central
# {0} - numero de casos
AllCasesSearchDialog.caseLabel.text=El Repositorio Central contiene {0} caso(s).
AllCasesSearchDialog.correlationValueTextField.domainExample=Example: "domain.com"
AllCasesSearchDialog.correlationValueTextField.emailExample=Example: "user@host.com"
AllCasesSearchDialog.correlationValueTextField.filesExample=Example: "f0e1d2c3b4a5968778695a4b3c2d1e0f"
AllCasesSearchDialog.correlationValueTextField.iccidExample=Example: "89 91 19 1299 99 329451 0"
AllCasesSearchDialog.correlationValueTextField.imeiExample=Example: "351756061523999"
AllCasesSearchDialog.correlationValueTextField.imsiExample=Example: "310150123456789"
AllCasesSearchDialog.correlationValueTextField.macExample=Example: "0C-14-F2-01-AF-45"
AllCasesSearchDialog.correlationValueTextField.phoneExample=Example: "(800)123-4567"
AllCasesSearchDialog.correlationValueTextField.ssidExample=Example: "WirelessNetwork-5G"
AllCasesSearchDialog.correlationValueTextField.usbExample=Example: "4&1234567&0"
AllCasesSearchDialog.descriptionLabel.text=<html>Buscar el Repositorio Central para los valores dados.</html>
AllCasesSearchDialog.dialogTitle.text=Busqueda Repositorio Central
AllCasesSearchDialog.emptyNode.text=No se encontraron resultados.
AllCasesSearchDialog.errorLabel.text=\
AllCasesSearchDialog.correlationTypeLabel.text=Tipo:
AllCasesSearchDialog.resultsDescription.text=Busqueda Repositorio Central
AllCasesSearchDialog.resultsTitle.text=Todos los Casos
AllCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription=
AllCasesSearchDialog.searchButton.AccessibleContext.accessibleName=Search
AllCasesSearchDialog.searchButton.text=Buscar
AllCasesSearchDialog.correlationValueLabel.text=Valor:
AllCasesSearchDialog.casesLabel.text=\
AllCasesSearchDialog.correlationValueTextArea.text=
AllCasesSearchDialog.normalizedLabel.text=Los valores se normalizarán para asegurar consistencia en mayúsculas y formato.
AllCasesSearchDialog.validation.genericMessage=El valor proporcionado no es válido.
AllCasesSearchDialog.validation.invalidDomain=El valor proporcionado no es un dominio válido.
AllCasesSearchDialog.validation.invalidEmail=El valor proporcionado no es una dirección de correo electrónico válida.
AllCasesSearchDialog.validation.invalidHash=El valor proporcionado no es un hash MD5 válido.
AllCasesSearchDialog.validation.invalidIccid=El valor proporcionado no es un número ICCID válido.
AllCasesSearchDialog.validation.invalidImei=El valor proporcionado no es un número IMEI válido.
AllCasesSearchDialog.validation.invalidImsi=El valor proporcionado no es un número IMSI válido.
AllCasesSearchDialog.validation.invalidMac=El valor proporcionado no es una dirección MAC válida.
AllCasesSearchDialog.validation.invalidPhone=El valor proporcionado no es un número de teléfono válido.
AllCasesSearchDialog.validation.invalidSsid=El valor proporcionado no es una red inalámbrica válida.
AllCasesSearchNode.getName.text=Otros Casos de Búsqueda
CorrelationAttributeInstanceNode.columnName.case=Caso
CorrelationAttributeInstanceNode.columnName.comment=Comentario
CorrelationAttributeInstanceNode.columnName.dataSource=Fuente de Datos
CorrelationAttributeInstanceNode.columnName.device=Dispositivo
CorrelationAttributeInstanceNode.columnName.known=Conocido
CorrelationAttributeInstanceNode.columnName.name=Nombre
CorrelationAttributeInstanceNode.columnName.path=Ruta
CorrelationAttributeInstanceNode.columnName.value=Valor
CTL_AllCasesSearchAction=Busqueda Repositorio Central

View File

@ -0,0 +1,4 @@
CTL_ResetWindowsAction=Restablecer Windows
ResetWindowAction.caseCloseFailure.text=Incapaz de cerrar el caso actual, el software se reiniciara y las ubicaciones de las ventanas se restableceran la proxima vez que se cierre el software..
ResetWindowAction.caseSaveMetadata.text=Incapaz de guardar la ruta del caso actual, el software se reiniciara y las ubicaciones de las ventanas se restableceran, pero el caso actual no se abrira al reiniciar..
ResetWindowAction.confirm.text=Para realizar el restablecimiento de las ubicaciones de las ventanas, el software se cerrara y reiniciara. Si actualmente hay un caso abierto, se cerrara. Si la ingestion o una busqueda esta en curso, se terminara. ¿Estas seguro de que deseas reiniciar el software para restablecer todas las ubicaciones de las ventanas?

View File

@ -66,8 +66,8 @@ Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the
Case.open.msgDlg.updated.title=Case Database Schema Update
Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \n\
this case are missing. Would you like to search for them now?\n\
Previously, the image was located at:\n\
{0}\n\
Previously, the image with host, {0}, was located at:\n\
{1}\n\
Please note that you will still be able to browse directories and generate reports\n\
if you choose No, but you will not be able to view file content or run the ingest process.
Case.checkImgExist.confDlg.doesntExist.title=Missing Image

View File

@ -16,6 +16,7 @@ Case.exceptionMessage.cannotDeleteCurrentCase=Cannot delete current case, it mus
Case.exceptionMessage.cannotGetLockToDeleteCase=Cannot delete case because it is open for another user or host.
Case.exceptionMessage.cannotLocateMainWindow=Cannot locate main application window
Case.exceptionMessage.cannotOpenMultiUserCaseNoSettings=Multi-user settings are missing (see Tools, Options, Multi-user tab), cannot open a multi-user case.
Case.exceptionMessage.contentProviderCouldNotBeFound=Content provider was specified for the case but could not be loaded.
# {0} - exception message
Case.exceptionMessage.couldNotCreatCollaborationMonitor=Failed to create collaboration monitor:\n{0}.
# {0} - exception message
@ -252,8 +253,8 @@ Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the
Case.open.msgDlg.updated.title=Case Database Schema Update
Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \n\
this case are missing. Would you like to search for them now?\n\
Previously, the image was located at:\n\
{0}\n\
Previously, the image with host, {0}, was located at:\n\
{1}\n\
Please note that you will still be able to browse directories and generate reports\n\
if you choose No, but you will not be able to view file content or run the ingest process.
Case.checkImgExist.confDlg.doesntExist.title=Missing Image

View File

@ -0,0 +1,483 @@
AddImageWizardIngestConfigPanel.name.text=Configurar Ingesta
AddImageWizardSelectDspVisual.multiUserWarning.text=Este tipo de Procesador de Fuente de Datos no esta disponible en modo multiusuario
AddImageWizardSelectHostPanel_title=Seleccionar Host para agregar la Fuente de Datos a
AddImageWizardSelectHostVisual_getValidationMessage_noHostSelected=Por favor, seleccione un host existente.
AddImageWizardSelectHostVisual_title=Seleccionar Host
# {0} - exception message
Case.closeException.couldNotCloseCase=Error al cerrar el caso: {0}
Case.creationException.couldNotAcquireResourcesLock=No se pudo obtener el bloqueo de los recursos del caso
Case.deleteCaseConfirmationDialog.message=¿Esta seguro de que desea cerrar y eliminar el caso actual?
Case.deleteCaseConfirmationDialog.title=¿Eliminar el caso actual?
# {0} - exception message
Case.deleteCaseFailureMessageBox.message=Error al eliminar el caso: {0}
Case.deleteCaseFailureMessageBox.title=No se pudo eliminar el caso
Case.exceptionMessage.cancelled=Cancelado.
Case.exceptionMessage.cannotDeleteCurrentCase=No se puede eliminar el caso actual, primero debe cerrarse.
Case.exceptionMessage.cannotGetLockToDeleteCase=No se puede eliminar el caso porque esta abierto para otro usuario o host.
Case.exceptionMessage.cannotLocateMainWindow=No se puede localizar la ventana principal de la aplicacion
Case.exceptionMessage.cannotOpenMultiUserCaseNoSettings=Faltan las configuraciones de multiusuario (ver Herramientas, Opciones, pestania de multiusuario), no se puede abrir un caso de multiusuario.
# {0} - exception message
Case.exceptionMessage.couldNotCreatCollaborationMonitor=Error al crear el monitor de colaboracion:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotCreateCaseDatabase=Error al crear la base de datos del caso:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotCreateCaseNodeData=Error al crear los datos del nodo del servicio de coordinacion:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotGetDbServerConnectionInfo=Error al obtener informacion de conexion del servidor de la base de datos del caso:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotOpenCaseDatabase=Error al abrir la base de datos del caso:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotOpenRemoteEventChannel=Error al abrir el canal de eventos remotos:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotSaveCaseMetadata=Error al guardar los metadatos del caso:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotSaveDbNameToMetadataFile=Error al guardar el nombre de la base de datos del caso en el archivo de metadatos del caso:\n{0}.
# {0} - exception message
Case.exceptionMessage.couldNotUpdateCaseNodeData=Error al actualizar los datos del nodo del servicio de coordinacion:\n{0}.
Case.exceptionMessage.dataSourceNotFound=No se encontro la fuente de datos.
# {0} - case display name
Case.exceptionMessage.deletionInterrupted=Se cancelo la eliminacion del caso {0}.
Case.exceptionMessage.emptyCaseDir=Debe especificar una ruta de directorio para el caso.
Case.exceptionMessage.emptyCaseName=Debe especificar un nombre de caso.
Case.exceptionMessage.errorDeletingDataSourceFromCaseDb=Ocurrio un error al eliminar la fuente de datos de la base de datos del caso.
Case.exceptionMessage.errorDeletingDataSourceFromTextIndex=Ocurrio un error al eliminar la fuente de datos del indice de texto.
Case.exceptionMessage.errorsDeletingCase=Ocurrieron errores al eliminar el caso. Consulte el registro de la aplicacion para mas detalles.
# {0} - exception message
Case.exceptionMessage.execExceptionWrapperMessage={0}
# {0} - exception message
Case.exceptionMessage.failedToConnectToCoordSvc=No se pudo conectar al servicio de coordinacion:\n{0}.
# {0} - exception message
Case.exceptionMessage.failedToFetchCoordSvcNodeData=No se pudo obtener los datos del nodo del servicio de coordinacion:\n{0}.
# {0} - exception message
Case.exceptionMessage.failedToLockCaseForDeletion=No se pudo bloquear exclusivamente el caso para su eliminacion:\n{0}.
# {0} - exception message
Case.exceptionMessage.failedToReadMetadata=No se pudo leer los metadatos del caso:\n{0}.
Case.exceptionMessage.metadataUpdateError=No se pudo actualizar los metadatos del caso
# {0} - exception message
Case.exceptionMessage.unsupportedSchemaVersionMessage=Version del esquema de la base de datos del caso no soportada:\n{0}.
Case.lockingException.couldNotAcquireExclusiveLock=No se pudo obtener un bloqueo exclusivo en el caso.
Case.lockingException.couldNotAcquireSharedLock=No se pudo obtener un bloqueo compartido en el caso.
Case.open.exception.multiUserCaseNotEnabled=No se puede abrir un caso multiusuario si los casos multiusuario no estan habilitados. Consulte Herramientas, Opciones, Multiusuario.
# {0} - image
Case.openFileSystems.openingImage=Abriendo todos los sistemas de archivos para la imagen: {0}...
# {0} - case
Case.openFileSystems.retrievingImages=Recuperando imagenes para el caso: {0}...
Case.progressIndicatorCancelButton.label=Cancelar
Case.progressIndicatorTitle.closingCase=Cerrando caso
Case.progressIndicatorTitle.creatingCase=Creando caso
Case.progressIndicatorTitle.deletingCase=Eliminando caso
Case.progressIndicatorTitle.deletingDataSource=Eliminando fuente de datos
Case.progressIndicatorTitle.openingCase=Abriendo caso
Case.progressMessage.cancelling=Cancelando...
Case.progressMessage.clearingTempDirectory=Limpiando el directorio temporal del caso...
Case.progressMessage.closingApplicationServiceResources=Cerrando recursos de servicio especificos del caso...
Case.progressMessage.closingCaseDatabase=Cerrando la base de datos del caso...
Case.progressMessage.connectingToCoordSvc=Conectando al servicio de coordinacion...
Case.progressMessage.creatingCaseDatabase=Creando la base de datos del caso...
Case.progressMessage.creatingCaseDirectory=Creando directorio de caso...
Case.progressMessage.creatingCaseNodeData=Creando datos del nodo de servicio de coordinacion...
Case.progressMessage.deletingCaseDatabase=Eliminando base de datos de caso...
Case.progressMessage.deletingCaseDirCoordSvcNode=Eliminando directorio de caso, nodo de servicio de coordinacion...
Case.progressMessage.deletingCaseDirectory=Eliminando directorio de caso...
Case.progressMessage.deletingDataSource=Eliminando la fuente de datos del caso...
Case.progressMessage.deletingResourcesCoordSvcNode=Eliminando recursos del caso, nodo de servicio de coordinacion...
Case.progressMessage.deletingTextIndex=Eliminando indice de texto...
Case.progressMessage.fetchingCoordSvcNodeData=Obteniendo datos del nodo de servicio de coordinacion para el caso...
Case.progressMessage.openingApplicationServiceResources=Abriendo recursos de caso del servicio de aplicaciones...
Case.progressMessage.openingCaseDatabase=Abriendo base de datos del caso...
Case.progressMessage.openingCaseLevelServices=Abriendo servicios a nivel de caso...
Case.progressMessage.preparing=Preparando...
Case.progressMessage.removingCaseFromRecentCases=Eliminando caso del menu de Casos Recientes...
Case.progressMessage.savingCaseMetadata=Guardando metadatos del caso en archivo...
Case.progressMessage.settingUpNetworkCommunications=Configurando comunicaciones de red...
Case.progressMessage.shuttingDownNetworkCommunications=Cerrando comunicaciones de red...
Case.progressMessage.switchingLogDirectory=Cambiando directorio de registro...
Case.progressMessage.updatingCaseNodeData=Actualizando datos del nodo de servicio de coordinacion...
# {0} - serviceName
Case.serviceCloseResourcesProgressIndicator.title={0} Cerrando recursos del caso
# {0} - service name
Case.serviceOpenCaseResourcesProgressIndicator.cancellingMessage=Cancelando apertura de recursos del casoy {0}...
# {0} - service name
Case.serviceOpenCaseResourcesProgressIndicator.title={0} Abriendo recursos del caso
# {0} - service name
Case.servicesException.notificationTitle={0} Error
# {0} - service name
# {1} - exception message
Case.servicesException.serviceResourcesCloseError=No se pudieron cerrar los recursos del caso para el servicio {0}: {1}
Case_caseType_multiUser=Caso multiusuario
Case_caseType_singleUser=Caso de usuario unico
CaseDetailsPanel.casePanel.border.title=Caso
CaseDetailsPanel.examinerLabel.text=Nombre:
CaseDetailsPanel.examinerPanel.border.title=Examinador
CaseDetailsPanel.lbCaseUUIDLabel.text=Identificador del caso:
CaseDetailsPanel.lbExaminerEmailLabel.text=Correo electronico:
CaseDetailsPanel.lbExaminerPhoneLabel.text=Telefono:
CaseDetailsPanel.lbNotesLabel.text=Notas:
CaseDetailsPanel.lbOrganizationNameLabel.text=Nombre:
CaseDetailsPanel.lbPointOfContactEmailLabel.text=Correo electronico:
CaseDetailsPanel.lbPointOfContactNameLabel.text=Punto de contacto:
CaseDetailsPanel.lbPointOfContactPhoneLabel.text=Telefono:
CaseDetailsPanel.pnOrganization.border.title=Organizacion
CaseInformationPanel.caseDetails.header=Detalles
CaseInformationPanel.editDetailsButton.text=Editar detalles
CaseInformationPanel.editDetailsDialog.title=Editar detalles del caso
CaseOpenAction.msgDlg.cantOpenCase.title=Error al abrir el caso
CTL_AddImage=Agregar fuente de datos
CTL_AddImageButton=Agregar fuente de datos
CTL_CaseCloseAct=Cerrar caso
CTL_CaseNewAction=Nuevo caso
CTL_CaseDetailsAction=Detalles del caso
CTL_CaseDeleteAction=Eliminar caso
CTL_CaseDeleteAction=Eliminar caso
CTL_CaseOpenAction=Abrir caso
CTL_UnpackagePortableCaseAction=Desempacar y abrir caso portatil
DeleteDataSourceAction.confirmationDialog.message=¿Estas seguro de que deseas quitar la fuente de datos seleccionada del caso?\nTen en cuenta que el caso se cerrara y volvera a abrir durante la eliminacion..
# {0} - exception message
DeleteDataSourceAction.exceptionMessage.couldNotReopenCase=No se pudo volver a abrir el caso:\n{0}\nPor favor, revisa el registro de la aplicacion para mas detalles..
# {0} - exception message
DeleteDataSourceAction.exceptionMessage.dataSourceDeletionError=Ocurrio un error al eliminar la fuente de datos:\n{0}\nPor favor, revisa el registro de la aplicacion para mas detalles..
DeleteDataSourceAction.ingestRunningWarningDialog.message=No se pueden eliminar fuentes de datos de un caso cuando la ingestion esta en ejecucion..
DeleteDataSourceAction.name.text=Eliminar fuente de datos
EditOptionalCasePropertiesPanel.cancelButton.text=Cancelar
EditOptionalCasePropertiesPanel.saveButton.text=Guardar
GeneralFilter.encaseImageDesc.text=Imagenes de Encase (*.e01)
GeneralFilter.executableDesc.text=Ejecutables (*.exe)
GeneralFilter.graphicImageDesc.text=Imagenes (*.png, *.jpg, *.jpeg, *.gif, *.bmp)
GeneralFilter.rawImageDesc.text=Imagenes en bruto (*.img, *.dd, *.001, *.aa, *.raw, *.bin)
GeneralFilter.virtualMachineImageDesc.text=Maquinas virtuales (*.vmdk, *.vhd)
ImageFilePanel.000.confirmationMessage=TEl archivo seleccionado tiene extension .001, pero hay un archivo .000 en la secuencia de imagenes en bruto.\n¿Deberia usarse el archivo .000 como inicio en lugar del archivo .001 seleccionado?\n
ImageFilePanel.moduleErr=Error de modulo
ImageFilePanel.moduleErr.msg=Un modulo causo un error al escuchar las actualizaciones del panel de archivos de imagen. Revisa el registro para determinar que modulo. Algunos datos podrian estar incompletos..\n
ImageFilePanel.validatePanel.dataSourceOnCDriveError=Advertencia: La ruta de la fuente de datos para varios usuarios esta en la unidad "C:"
ImageFilePanel.validatePanel.invalidMD5=Hash MD5 invalido
ImageFilePanel.validatePanel.invalidSHA1=Hash SHA1 invalido
ImageFilePanel.validatePanel.invalidSHA256=Hash SHA256 invalido
IngestJobInfoPanel.IngestJobTableModel.EndTime.header=Hora de finalizacion
IngestJobInfoPanel.IngestJobTableModel.IngestStatus.header=Estado de ingestion
IngestJobInfoPanel.IngestJobTableModel.StartTime.header=Hora de inicio
IngestJobInfoPanel.IngestModuleTableModel.ModuleName.header=Nombre del modulo
IngestJobInfoPanel.IngestModuleTableModel.ModuleVersion.header=Version del modulo
IngestJobInfoPanel.loadIngestJob.error.text=Error al cargar trabajos de ingestion.
IngestJobInfoPanel.loadIngestJob.error.title=Fallo en la carga
LocalDiskPanel.errorMessage.noOpenCaseBody=Panel de Disco Local no pudo obtener el caso abierto.
LocalDiskPanel.errorMessage.noOpenCaseTitle=No hay caso abierto disponible
LocalDiskPanel.imageWriterError.directoryNotExist=Error - directorio no existe
LocalDiskPanel.imageWriterError.emptyPath=Error - ingresar ruta para VHD
LocalDiskPanel.imageWriterError.fileExists=Error - ruta de VHD ya existe
LocalDiskPanel.imageWriterError.isDirectory=Error - ruta de VHD es un directorio
LocalDiskPanel.localDiskMessage.unspecified=No especificado
LocalDiskPanel.moduleErrorMessage.body=Un modulo causo un error al escuchar actualizaciones del Panel de Disco Local. Consulte el registro para determinar que modulo. Algunos datos podrian estar incompletos.
LocalDiskPanel.moduleErrorMessage.title=Error del modulo
LocalDiskSelectionDialog.columnName.diskName=Nombre del disco
LocalDiskSelectionDialog.columnName.diskSize=Tamanio del disco
LocalDiskSelectionDialog.errorMessage.disksNotDetected=No se detectaron discos. En algunos sistemas, se requieren privilegios de administrador (o "Ejecutar como administrador").
LocalDiskSelectionDialog.errorMessage.drivesNotDetected=No se detectaron unidades locales. La deteccion automatica no es compatible en este sistema operativo o se requieren privilegios de administrador
LocalDiskSelectionDialog.errorMessage.someDisksNotDetected=Algunos discos no fueron detectados. En algunos sistemas, se requieren privilegios de administrador (o "Ejecutar como administrador").
LocalDiskSelectionDialog.moduleErrorMessage.body=Un modulo causo un error al escuchar actualizaciones del Panel de Disco Local. Consulte el registro para determinar que modulo. Algunos datos podrian estar incompletos.
LocalDiskSelectionDialog.moduleErrorMessage.title=Error del modulo
LocalDiskSelectionDialog.tableMessage.loading=Cargando discos locales...
LocalDiskSelectionDialog.tableMessage.noDrives=No hay unidades accesibles
LocalFilesDSProcessor.logicalEvidenceFilter.desc=Archivos de evidencia logica (L01)
LocalFilesPanel.pathValidation.dataSourceOnCDriveError=Advertencia: La ruta al origen de datos multiusuario esta en la unidad "C:"
LocalFilesPanel.pathValidation.getOpenCase=WARNING: Excepcion al obtener el caso abierto.
LogicalEvidenceFilePanel.moduleErr.msg=Un modulo causo un error al escuchar las actualizaciones del panel de archivos de evidencia logica. Consulte el registro para determinar que modulo. Algunos datos podrian estar incompletos..
LogicalEvidenceFilePanel.moduleErr.name=Error del modulo
LogicalEvidenceFilePanel.pathValidation.dataSourceOnCDriveError=Advertencia: La ruta al origen de datos multiusuario esta en la unidad "C:"
LogicalEvidenceFilePanel.pathValidation.getOpenCase.Error=Advertencia: Excepcion al obtener el caso abierto.
LogicalEvidenceFilePanel.validatePanel.nonL01Error.text=Solo se admiten archivos con la extension de archivo .l01 aqui.
LogicalFilesDspPanel.subTypeComboBox.l01FileOption.text=Archivo de evidencia logica (L01)
LogicalFilesDspPanel.subTypeComboBox.localFilesOption.text=Archivos y carpetas locales
OpenIDE-Module-Name=Caso
NewCaseVisualPanel1.caseNameLabel.text_1=Nombre del caso:
NewCaseVisualPanel1.caseDirLabel.text=Directorio base:
NewCaseVisualPanel1.caseDirBrowseButton.text=Examinar
NewCaseVisualPanel1.caseNameTextField.text_1=
NewCaseVisualPanel1.caseParentDirTextField.text=
NewCaseVisualPanel1.caseDirTextField.text_1=
CueBannerPanel.autopsyLogo.text=
CueBannerPanel.closeButton.text=Close
# {0} - caseErrorMessage
OpenMultiUserCaseAction.caseOpeningErrorErrorMsg=Error al abrir el caso: {0}
OpenMultiUserCaseAction.menuItemText=Abrir caso
OpenMultiUserCaseDialog.title=Abrir caso multiusuario
OpenRecentCasePanel.cancelButton.text=Cancelar
OpenRecentCasePanel.jLabel1.text=Casos recientes
AddImageErrorsDialog.title=Agregar registro de imagenes
AddImageErrorsDialog.copyButton.toolTipText=Copiar errores al portapapeles
AddImageErrorsDialog.copyButton.text=Copiar
AddImageErrorsDialog.closeButton.toolTipText=Cerrar esta ventana
AddImageErrorsDialog.closeButton.text=Cerrar
OpenRecentCasePanel.openButton.text=Abrir
ImageFilePanel.pathLabel.text=Ruta:
ImageFilePanel.browseButton.text=Examinar
ImageFilePanel.pathTextField.text=
MissingImageDialog.selectButton.text=Seleccionar imagen
MissingImageDialog.titleLabel.text=Buscar imagen faltante
MissingImageDialog.cancelButton.text=Cancelar
AddImageWizardAddingProgressVisual.statusLabel.text=Fuente de datos ha sido agregada a la base de datos local. Archivos estan siendo analizados..
AddImageWizardAddingProgressVisual.progressLabel.text=<progress>
AddImageWizardAddingProgressVisual.viewLogButton.text=Ver Registro
AddImageWizardAddingProgressVisual.subTitle1Label.text=Procesando fuente de datos y agregandola a una base de datos local. El analisis de archivos iniciara cuando esto termine..
ImageFilePanel.timeZoneLabel.text=Zona horaria:
ImageFilePanel.noFatOrphansCheckbox.text=Ignorar archivos huerfanos en sistemas de archivos FAT
ImageFilePanel.noFatOrphansCheckbox.toolTipText=
ImageFilePanel.descLabel.text=(resultados mas rapidos, aunque algunos datos no seran buscados)
LocalDiskPanel.timeZoneLabel.text=Zona horaria:
LocalDiskPanel.noFatOrphansCheckbox.toolTipText=
LocalDiskPanel.noFatOrphansCheckbox.text=Ignorar archivos huerfanos en sistemas de archivos FAT
LocalDiskPanel.descLabel.text=(resultados mas rapidos, aunque algunos datos no seran buscados)
MissingImageDialog.browseButton.text=Navegar
MissingImageDialog.pathNameTextField.text=
AddImageWizardAddingProgressVisual.progressTextArea.border.title=Estado
AddImageAction.wizard.title=Agregar Fuente de Datos
AddImageAction.ingestConfig.ongoingIngest.msg=<html>La ingestion esta en curso en otra fuente de datos. Agregar una nueva fuente ahora podria reducir la velocidad de la ingestion actual..<br />¿Desea continuar y aniadir una nueva fuente de datos ahora?</html>
AddImageAction.ingestConfig.ongoingIngest.title=Ingestion en progreso
AddImageTask.run.progress.adding=Agregando: {0}
AddImageTask.interrupt.exception.msg=Error deteniendo el proceso de agregar imagen.
AddImageWizardAddingProgressPanel.isValid.focusNext=Siguiente >
AddImageWizardAddingProgressPanel.stateStarted.progressBarText=*Este proceso puede llevar algo de tiempo para fuentes de datos grandes.
AddImageWizardAddingProgressVisual.addingDsComplete.text=Agregando Fuente de Datos - Completo
AddImageWizardAddingProgressVisual.getName.text=Agregar Fuente de Datos
AddImageWizardAddingProgressVisual.showErrors.critText=*Error al agregar la fuente de datos (se encontraron errores criticos). Haz clic abajo para ver el registro.
AddImageWizardAddingProgressVisual.showErrors.nonCritText=*Fuente de Datos agregada (se encontraron errores no criticos). Haz clic abajo para ver el registro.
AddImageWizardChooseDataSourcePanel.moveFocusNext=Siguiente >
AddImageWizardChooseDataSourceVisual.getName.text=Seleccionar Fuente de Datos
AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text=*Fuente de Datos agregada.
AddImageWizardIngestConfigPanel.dsProcDone.errs.text=*Se encontraron errores al agregar la Fuente de Datos.
AddImageWizardIngestConfigVisual.getName.text=Configurar Ingesta
AddImageWizardIterator.stepXofN=Etapa {0} de {1}
AddLocalFilesTask.localFileAdd.progress.text=Agregando: {0}/{1}
Case.getCurCase.exception.noneOpen=No se puede obtener el caso actual; ¡no hay caso abierto!
Case.open.msgDlg.updated.msg=Esquema de la base de datos del caso actualizado.\nSe ha realizado una copia de seguridad de la base de datos con la siguiente ruta:\n {0}
Case.open.msgDlg.updated.title=Actualizacion del Esquema de la Base de Datos del Caso
Case.checkImgExist.confDlg.doesntExist.msg=Falta una de las imagenes asociados con \neste caso. ¿Desea buscarlas ahora?\nAnteriormente la imagen estaba ubicada en:\n{0}\nTenga en cuenta que aun podra navegar por los directorios y generar informes\nsi elige NO, pero no podra ver el contenido de archivos o ejecutar el proceso de ingestion.
Case.checkImgExist.confDlg.doesntExist.title=Imagen faltante
Case.addImg.exception.msg=Error al agregar imagen al caso
Case.updateCaseName.exception.msg=Error mientras se intenta actualizar el nombre del caso.
Case.updateExaminer.exception.msg=Error mientras se intenta actualizar el examinador.
Case.updateCaseNum.exception.msg=Error mientras se intenta actualizar el numero del caso.
Case.exception.errGetRootObj=Error al obtener objetos raiz.
Case.createCaseDir.exception.existNotDir=No se puede crear el directorio del caso, ya existe y no es un directorio: {0}
Case.createCaseDir.exception.existCantRW=No se puede crear el directorio del caso, ya existe y no se puede leer/escribir: {0}
Case.createCaseDir.exception.cantCreate=No se puede crear el directorio del caso o ya existe: {0}
Case.createCaseDir.exception.cantCreateCaseDir=No se pudo crear el directorio del caso: {0}
Case.createCaseDir.exception.cantCreateModDir=No se pudo crear el directorio de salida de modulos: {0}
Case.createCaseDir.exception.cantCreateReportsDir=No se pudo crear el directorio de salida de informes: {0}
Case.CollaborationSetup.FailNotify.ErrMsg=Error al conectar con otros nodos que puedan estar colaborando en este caso..
Case.CollaborationSetup.FailNotify.Title=Fallo de conexion.
Case.GetCaseTypeGivenPath.Failure=No se puede obtener el tipo de caso.
Case.metaDataFileCorrupt.exception.msg=El archivo de metadatos del caso (.aut) esta corrupto..
Case.deleteReports.deleteFromDiskException.log.msg=No se puede eliminar el informe del disco..
Case.deleteReports.deleteFromDiskException.msg=No se puede eliminar el informe {0} del disco. Puedes eliminarlo manualmente desde {1}
CaseDeleteAction.closeConfMsg.text=¿Estas seguro/a de que quieres cerrar y eliminar este caso? \nNombre del caso: {0}\nDirectorio del Caso: {1}
CaseDeleteAction.closeConfMsg.title=Advertencia: Cerrando el Caso Actual
CaseDeleteAction.msgDlg.fileInUse.msg=La accion de eliminar no puede completarse completamente porque la carpeta o archivo en ella esta abierto por otro programa.\n\nCierre la carpeta y el archivo e intentelo de nuevo o puede eliminar el caso manualmente.
CaseDeleteAction.msgDlg.fileInUse.title=Error: Carpeta En Uso
CaseDeleteAction.msgDlg.caseDelete.msg=Caso {0} ha sido eliminado.
CaseOpenAction.autFilter.title={0} Archivo de Caso ( {1})
CaseCreateAction.msgDlg.cantCreateCase.msg=No se puede crear el caso
IntervalErrorReport.NewIssues=nuevo problema(s)
IntervalErrorReport.TotalIssues=total de problema(s)
IntervalErrorReport.ErrorText=Error de Conexion de Base de Datos
CaseDetailsAction.window.title=Detalles del Caso
CueBannerPanel.title.text=Abrir Caso Reciente
ImageDSProcessor.dsType.text=Archivo de Imagen de Disco o VM
ImageDSProcessor.allDesc.text=Todos los Tipos Soportados
LocalDiskDSProcessor.dsType.text=Disco Local
LocalFilesDSProcessor.dsType=Archivos Logicos
LocalFilesDSProcessor.toString.text=Archivos Logicos
LocalFilesPanel.contentType.text=LOCAL
LocalFilesPanel.moduleErr=Error del Modulo
LocalFilesPanel.moduleErr.msg=Un modulo causo un error al escuchar las actualizaciones del Panel de Archivos Locales. Verificar el registro para determinar que modulo. Algunos datos podrian estar incompletos.
MissingImageDialog.display.title=Buscar Imagen Faltante
MissingImageDialog.confDlg.noFileSel.msg=Ningun archivo de imagen ha sido seleccionado. ¿Estas seguro/a?\n¿quiere salir sin encontrar la imagen?
MissingImageDialog.confDlg.noFileSel.title=Imagen faltante
MissingImageDialog.ErrorSettingImage=Error al establecer la ruta de la imagen. Por favor, intenta de nuevo.
NewCaseVisualPanel1.getName.text=Informacion del Caso
NewCaseVisualPanel1.caseDirBrowse.selectButton.text=Seleccionar
NewCaseVisualPanel1.badCredentials.text=Mala configuracion multiusuario (ver Herramientas, Opciones, Multiusuario) o los servicios estan fuera de servicio.
NewCaseVisualPanel2.getName.text=Informacion Opcional
NewCaseWizardAction.newCase.windowTitle.text=Informacion del Caso Nueva
NewCaseWizardAction.getName.text=Asistente para Nuevo Caso
NewCaseWizardAction.databaseProblem1.text=No se puede abrir la base de datos. Cancelando la creacion del caso.
NewCaseWizardAction.databaseProblem2.text=Error
NewCaseWizardPanel1.validate.errMsg.invalidSymbols=El Nombre del Caso no puede contener ninguno de los siguientes simbolos: \\ / : * ? " &lt; > |
NewCaseWizardPanel1.validate.errMsg.dirExists=Directorio del Caso. ''{0}'' ya existe.
NewCaseWizardPanel1.validate.confMsg.createDir.msg=El directorio base "{0}" no existe. \n\n¿Quiere crear ese directorio?
NewCaseWizardPanel1.validate.confMsg.createDir.title=Crear directorio
NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=Error: No se pudo crear el directorio principal del caso {0}
NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=Evitado de crear el directorio base {0}
NewCaseWizardPanel1.validate.errMsg.cantCreateDir=Error: No se pudo crear el directorio.
NewCaseWizardPanel1.validate.errMsg.invalidBaseDir.msg=ERROR: El Directorio Base que ingresaste no es valido.\nPor favor, ingrese un Directorio Base valido.
NewCaseWizardPanel1.createDir.errMsg.cantCreateDir.msg=ERROR: No se pudo crear el directorio del caso. \nIntroduzca un nombre de caso y un directorio validos.
NewCaseWizardPanel2.validate.errCreateCase.msg=Error al crear el caso
OpenRecentCasePanel.colName.caseName=Nombre del Caso
OpenRecentCasePanel.colName.path=Ruta
OptionalCasePropertiesPanel.bnNewOrganization.text=Administrar Organizaciones
OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Nombre:
OptionalCasePropertiesPanel.caseNumberLabel.text=Numero:
OptionalCasePropertiesPanel.casePanel.border.title=Caso
OptionalCasePropertiesPanel.errorDialog.emptyCaseNameMessage=No se ingreso el nombre del caso.
OptionalCasePropertiesPanel.errorDialog.invalidCaseNameMessage=Los nombres de caso no pueden incluir los siguientes simbolos: \\, /, :, *, ?, ", <, >, |
OptionalCasePropertiesPanel.errorDialog.noOpenCase.errMsg=Excepcion mientras se obtiene el caso abierto.
OptionalCasePropertiesPanel.examinerLabel.text=Nombre:
OptionalCasePropertiesPanel.examinerPanel.border.title=Examinador
OptionalCasePropertiesPanel.lbExaminerEmailLabel.text=Correo electronico:
OptionalCasePropertiesPanel.lbExaminerPhoneLabel.text=Telefono:
OptionalCasePropertiesPanel.lbNotesLabel.text=Notas:
OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Analisis de la organizacion se esta realizando para:
OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text=Correo electronico:
OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text=Punto de contacto
OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Telefono:
OptionalCasePropertiesPanel.orgainizationPanel.border.title=Organizacion
RecentCases.exception.caseIdxOutOfRange.msg=El indice del caso reciente {0} esta fuera de rango.
RecentCases.getName.text=Borrar Casos Recientes
# {0} - case name
RecentItems.openRecentCase.msgDlg.text=El caso {0} ya no existe.
SelectDataSourceProcessorPanel.name.text=Seleccionar Tipo de Fuente de Datos
StartupWindow.title.text=Bienvenido
# {0} - autFilePath
StartupWindowProvider.openCase.cantOpen=No se puede abrir el caso previamente abierto con el archivo de metadatos: {0}
# {0} - reOpenFilePath
StartupWindowProvider.openCase.deleteOpenFailure=No se puede abrir ni eliminar el archivo que contiene la ruta {0} al caso previamente abierto. El caso anterior no se abrira.
# {0} - autFilePath
StartupWindowProvider.openCase.noFile=No se puede abrir el caso previamente abierto porque no se encontro el archivo de metadatos: {0}
UnpackagePortableCaseDialog.title.text=Desempaquetar Caso Portatil
UnpackagePortableCaseDialog.UnpackagePortableCaseDialog.extensions=Estuche portatil comprimido (.zip, .zip.001)
UnpackagePortableCaseDialog.validatePaths.badExtension=La extension del archivo debe ser .zip o .zip.001
# {0} - case folder
UnpackagePortableCaseDialog.validatePaths.caseFolderExists=La carpeta {0} ya existe
UnpackagePortableCaseDialog.validatePaths.caseIsNotFile=La ruta seleccionada no es un archivo
UnpackagePortableCaseDialog.validatePaths.caseNotFound=El archivo no existe
UnpackagePortableCaseDialog.validatePaths.folderNotFound=La carpeta no existe
UnpackagePortableCaseDialog.validatePaths.notAFolder=La ubicacion de salida no es un directorio
UnpackagePortableCaseProgressDialog.propertyChange.success=Estuche descomprimido con exito
UnpackagePortableCaseProgressDialog.title.text=Progreso de descompresion del estuche portatil
UnpackageWorker.doInBackground.canceled=Descompresion cancelada por el usuario
UnpackageWorker.doInBackground.errorCompressingCase=Error al descomprimir el estuche
UnpackageWorker.doInBackground.errorFinding7zip=No se pudo localizar el ejecutable 7-Zip
UnpackageWorker.doInBackground.previouslySeenCase=El estuche ha sido abierto previamente. ¿Abrirlo de nuevo?
UpdateRecentCases.menuItem.clearRecentCases.text=Borrar casos recientes
UpdateRecentCases.menuItem.empty=-Vacio-
AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancelar
NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Advertencia: La ruta a la carpeta del caso para varios usuarios esta en la unidad "C:"
NewCaseVisualPanel1.CaseFolderOnInternalDriveWindowsError.text=Advertencia: La ruta a la carpeta del caso esta en la unidad "C:". La carpeta del caso se crea en el sistema de destino
NewCaseVisualPanel1.CaseFolderOnInternalDriveLinuxError.text=Advertencia: La ruta a la carpeta del caso esta en el sistema de destino. Crear carpeta del caso en la unidad montada.
NewCaseVisualPanel1.uncPath.error=Error: Las rutas UNC no estan permitidas para casos de usuario unico.
CollaborationMonitor.addingDataSourceStatus.msg={0} Agregando fuente de datos
CollaborationMonitor.analyzingDataSourceStatus.msg={0} analizando {1}
MissingImageDialog.lbWarning.text=
MissingImageDialog.lbWarning.toolTipText=
NewCaseVisualPanel1.caseParentDirWarningLabel.text=
NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-Usuario\t\t
NewCaseVisualPanel1.singleUserCaseRadioButton.text=Usuario unico
NewCaseVisualPanel1.caseTypeLabel.text=Tipo de Caso:
SingleUserCaseConverter.BadDatabaseFileName=¡Archivo de base de datos no existe!
SingleUserCaseConverter.AlreadyMultiUser=¡El caso ya es multiusuario!
SingleUserCaseConverter.NonUniqueDatabaseName=Nombre de base de datos no es unico.
SingleUserCaseConverter.UnableToCopySourceImages=Incapaz de copiar imagenes de origen
SingleUserCaseConverter.CanNotOpenDatabase=Incapaz de abrir base de datos
CloseCaseWhileIngesting.Warning=La ingestion esta en ejecucion. ¿Estas seguro(a) de que deseas cerrar el caso?
CloseCaseWhileIngesting.Warning.title=Advertencia: Esto cerrara el caso actual
CasePropertiesForm.imagesTable.columnModel.title1=Eliminar
CasePropertiesForm.imagesTable.columnModel.title0=Ruta
IngestJobInfoPanel.jLabel1.text=Modulos de Ingestion
IngestJobInfoPanel.jLabel2.text=Trabajos de Ingestion
CaseInformationPanel.closeButton.text=Cerrar
LocalDiskPanel.copyImageCheckbox.text=Crear una imagen VHD de la unidad mientras esta siendo analizada.
LocalDiskPanel.jLabel1.text=Nota que al menos un modulo de ingestion debe ejecutarse para crear una copia completa
LocalDiskPanel.pathTextField.text=
LocalDiskPanel.browseButton.text=Examinar
LocalDiskPanel.changeDatabasePathCheckbox.text=Actualizar el caso para usar el archivo VHD al completar
CueBannerPanel.openRecentCaseButton.text=
CueBannerPanel.openRecentCaseLabel.text=Abrir caso reciente
ReviewModeCasePanel.cannotOpenCase=No se puede abrir el caso
ReviewModeCasePanel.casePathNotFound=Ruta del caso no encontrada
ReviewModeCasePanel.caseIsLocked=El caso de un solo usuario esta bloqueado.
ReviewModeCasePanel.CaseHeaderText=Caso
ReviewModeCasePanel.CreatedTimeHeaderText=Tiempo de creacion
ReviewModeCasePanel.StatusIconHeaderText=Estado
ReviewModeCasePanel.OutputFolderHeaderText=Carpeta de salida
ReviewModeCasePanel.LastAccessedTimeHeaderText=Tiempo de ultimo acceso
ReviewModeCasePanel.MetadataFileHeaderText=Archivo de metadatos
CueBannerPanel.newCaseLabel.text=Nuevo caso
CueBannerPanel.openCaseButton.text=
CueBannerPanel.openCaseLabel.text=Abrir caso
CueBannerPanel.newCaseButton.text=
ImageFilePanel.sectorSizeLabel.text=Tamanio de sector:
LocalDiskPanel.sectorSizeLabel.text=Tamanio de Sector:
LocalFilesPanel.displayNameLabel.text=Nombre de visualizacion del conjunto de archivos logicos: Predeterminado
LocalFilesPanel.errorLabel.text=Etiqueta de error
LocalFilesPanel.selectedPaths.toolTipText=
LocalFilesPanel.clearButton.toolTipText=Limpia las rutas de archivo locales seleccionadas actualmente
LocalFilesPanel.clearButton.text=Limpiar
LocalFilesPanel.selectButton.actionCommand=Agregar
LocalFilesPanel.selectButton.toolTipText=Agregar archivos y carpetas locales como archivos logicos
LocalFilesPanel.selectButton.text=Agregar
LocalFilesPanel.localFileChooser.dialogTitle=Seleccionar Archivos o Carpetas Locales
LocalFilesPanel.localFileChooser.approveButtonToolTipText=
LocalFilesPanel.localFileChooser.approveButtonText=Seleccionar
LogicalEvidenceFilePanel.selectButton.actionCommand=Agregar
LogicalEvidenceFilePanel.selectButton.toolTipText=Agregar archivos y carpetas locales como archivos logicos
LogicalEvidenceFilePanel.selectButton.text=Seleccionar
LogicalEvidenceFilePanel.errorLabel.text=Etiqueta de Error
LogicalEvidenceFilePanel.logicalEvidenceFileChooser.dialogTitle=Seleccionar Archivos o Carpetas Locales
LogicalEvidenceFilePanel.logicalEvidenceFileChooser.approveButtonToolTipText=
LogicalEvidenceFilePanel.logicalEvidenceFileChooser.approveButtonText=Seleccionar
LogicalEvidenceFilePanel.logicalEvidencePathField.text=
LocalFilesPanel.changeNameButton.text=Cambiar
LocalDiskPanel.selectDiskButton.text=Seleccionar Disco
LocalDiskSelectionDialog.refreshLocalDisksButton.text=Actualizar Discos Locales
LocalDiskSelectionDialog.errorLabel.text=Etiqueta de Error
LocalDiskSelectionDialog.selectLocalDiskLabel.text=Seleccionar un disco local:
LocalDiskSelectionDialog.cancelButton.text=Cancelar
LocalDiskSelectionDialog.okButton.text=Aceptar
LocalDiskPanel.localDiskLabel.text=Disco Local:
LocalDiskPanel.imageWriterErrorLabel.text=Etiqueta de Error
LocalDiskSelectionDialog.title=Seleccionar Disco Local
ImageFilePanel.md5HashLabel.text=MD5:
ImageFilePanel.sha1HashLabel.text=SHA-1:
ImageFilePanel.sha256HashLabel.text=SHA-256:
ImageFilePanel.sha256HashTextField.text=
ImageFilePanel.sha1HashTextField.text=
ImageFilePanel.md5HashTextField.text=
ImageFilePanel.errorLabel.text=Etiqueta de Error
ImageFilePanel.hashValuesNoteLabel.text=NOTA: Estos valores no seran validados cuando se agregue la fuente de datos..
ImageFilePanel.hashValuesLabel.text=Valores Hash (opcional):
CaseDetailsPanel.crDateLabel.text=Fecha de Creacion:
CaseDetailsPanel.caseDirLabel.text=Directorio del Caso:
CaseDetailsPanel.caseNumberLabel.text=Numero de Caso:
CaseDetailsPanel.lbDbName.text=Nombre de la Base de Datos:
CaseDetailsPanel.lbDbType.text=Tipo de Caso:
CaseDetailsPanel.caseNameLabel.text=Nombre del Caso:
OpenMultiUserCasePanel.searchLabel.text=Selecciona cualquier caso y comienza a escribir para buscar por nombre de caso
OpenMultiUserCasePanel.cancelButton.text=Cancelar
OpenMultiUserCasePanel.openSingleUserCaseButton.text=Abrir Caso de Usuario unico...
OpenMultiUserCasePanel.openSelectedCaseButton.text=Abrir Caso Seleccionado
OpenMultiUserCasePanel.searchLabel.text=Selecciona cualquier caso y comienza a escribir para buscar por nombre de caso
UnpackagePortableCaseDialog.desc2Label.text=Modulo de Informe de Caso Portatil.
UnpackagePortableCaseDialog.desc1Label.text=Desempaqueta un caso portatil para que pueda abrirse en Autopsy. Los casos portatiles se crean a traves de la
UnpackagePortableCaseDialog.exitButton.text=Salir
UnpackagePortableCaseDialog.unpackageButton.text=Desempaquetar
UnpackagePortableCaseDialog.caseSelectButton.text=Navegar
UnpackagePortableCaseDialog.outputSelectButton.text=Navegar
UnpackagePortableCaseDialog.caseTextField.text=
UnpackagePortableCaseDialog.outputTextField.text=
UnpackagePortableCaseDialog.caseErrorLabel.text=jLabel1
UnpackagePortableCaseDialog.outputErrorLabel.text=jLabel1
UnpackagePortableCaseProgressDialog.cancelButton.text=Cancelar
UnpackagePortableCaseProgressDialog.okButton.text=Aceptar
UnpackagePortableCaseProgressDialog.resultLabel.text=resultLabel
UnpackagePortableCaseDialog.extractLabel.text=Carpeta para extraer en:
UnpackagePortableCaseDialog.caseLabel.text=Caso Portatil:
NewCaseVisualPanel1.caseDataStoredLabel.text_1=Los datos del caso se almacenaran en el siguiente directorio:
SolrNotConfiguredDialog.okButton.text=Aceptar
SolrNotConfiguredDialog.title=Solr 8 Server No Configurado
SolrNotConfiguredDialog.EmptyKeywordSearchHostName=Solr 8 conexiones parametros no estan configurados. Por favor ir a Herramientas->Opciones->Multi Usuario.
SolrNotConfiguredDialog.messageLabel.text=<html>Casos Multi-Usuario habilitados pero servidor Solr 8 no ha sido configurado.<br>\nNuevos casos solo pueden crearse con Solr 8. Por favor ve a Herramientas->Opciones->Multi Usuario.\n</html>
AddImageWizardSelectHostVisual.hostDescription.text=Los hosts son usados para organizar fuentes de datos y otros datos.
AddImageWizardSelectHostVisual.useExistingHostRadio.text=Usar host existente
AddImageWizardSelectHostVisual.specifyNewHostTextField.text=
AddImageWizardSelectHostVisual.specifyNewHostRadio.text=Especificar nuevo nombre de host
AddImageWizardSelectHostVisual.generateNewRadio.text=Generar nuevo nombre de host basado en el nombre de la fuente de datos
AddImageWizardSelectHostVisual.validationMessage.text=\

View File

@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.casemodule;
import com.basistech.df.cybertriage.autopsy.CTIntegrationMissingDialog;
import org.sleuthkit.autopsy.featureaccess.FeatureAccessUtils;
import com.google.common.annotations.Beta;
import com.google.common.eventbus.Subscribe;
@ -178,6 +179,7 @@ public class Case {
private static final String CASE_ACTION_THREAD_NAME = "%s-case-action";
private static final String CASE_RESOURCES_THREAD_NAME = "%s-manage-case-resources";
private static final String NO_NODE_ERROR_MSG_FRAGMENT = "KeeperErrorCode = NoNode";
private static final String CT_PROVIDER_PREFIX = "CTStandardContentProvider_";
private static final Logger logger = Logger.getLogger(Case.class.getName());
private static final AutopsyEventPublisher eventPublisher = new AutopsyEventPublisher();
private static final Object caseActionSerializationLock = new Object();
@ -193,6 +195,8 @@ public class Case {
private final SleuthkitEventListener sleuthkitEventListener;
private CollaborationMonitor collaborationMonitor;
private Services caseServices;
// matches something like '\\.\PHYSICALDRIVE0'
private static final String PLACEHOLDER_DS_PATH_REGEX = "^\\s*\\\\\\\\\\.\\\\PHYSICALDRIVE\\d*\\s*$";
private volatile boolean hasDataSource = false;
private volatile boolean hasData = false;
@ -1304,9 +1308,18 @@ public class Case {
for (Map.Entry<Long, String> entry : imgPaths.entrySet()) {
long obj_id = entry.getKey();
String path = entry.getValue();
boolean fileExists = (new File(path).isFile() || DriveUtils.driveExists(path));
boolean fileExists = (new File(path).exists()|| DriveUtils.driveExists(path));
if (!fileExists) {
// CT-7336: ignore relocating datasources if file provider is present and placeholder path is used.
if (newCurrentCase.getMetadata() != null
&& !StringUtils.isBlank(newCurrentCase.getMetadata().getContentProviderName())
&& (path == null || path.matches(PLACEHOLDER_DS_PATH_REGEX))) {
continue;
}
try {
DataSource ds = newCurrentCase.getSleuthkitCase().getDataSource(obj_id);
String hostName = StringUtils.defaultString(ds.getHost() == null ? "" : ds.getHost().getName());
// Using invokeAndWait means that the dialog will
// open on the EDT but this thread will wait for an
// answer. Using invokeLater would cause this loop to
@ -1316,7 +1329,7 @@ public class Case {
public void run() {
int response = JOptionPane.showConfirmDialog(
mainFrame,
NbBundle.getMessage(Case.class, "Case.checkImgExist.confDlg.doesntExist.msg", path),
NbBundle.getMessage(Case.class, "Case.checkImgExist.confDlg.doesntExist.msg", hostName, path),
NbBundle.getMessage(Case.class, "Case.checkImgExist.confDlg.doesntExist.title"),
JOptionPane.YES_NO_OPTION);
if (response == JOptionPane.YES_OPTION) {
@ -1328,7 +1341,7 @@ public class Case {
}
});
} catch (InterruptedException | InvocationTargetException ex) {
} catch (InterruptedException | InvocationTargetException | TskCoreException | TskDataException ex) {
logger.log(Level.SEVERE, "Failed to show missing image confirmation dialog", ex); //NON-NLS
}
}
@ -2732,6 +2745,7 @@ public class Case {
"Case.progressMessage.openingCaseDatabase=Opening case database...",
"# {0} - exception message", "Case.exceptionMessage.couldNotOpenCaseDatabase=Failed to open case database:\n{0}.",
"# {0} - exception message", "Case.exceptionMessage.unsupportedSchemaVersionMessage=Unsupported case database schema version:\n{0}.",
"Case.exceptionMessage.contentProviderCouldNotBeFound=Content provider was specified for the case but could not be loaded.",
"Case.open.exception.multiUserCaseNotEnabled=Cannot open a multi-user case if multi-user cases are not enabled. See Tools, Options, Multi-User."
})
private void openCaseDataBase(ProgressIndicator progressIndicator) throws CaseActionException {
@ -2740,14 +2754,15 @@ public class Case {
String databaseName = metadata.getCaseDatabaseName();
ContentStreamProvider contentProvider = loadContentProvider(metadata.getContentProviderName());
if (StringUtils.isNotBlank(metadata.getContentProviderName()) && contentProvider == null) {
if (metadata.getContentProviderName().trim().toUpperCase().startsWith(CT_PROVIDER_PREFIX.toUpperCase())) {
new CTIntegrationMissingDialog(WindowManager.getDefault().getMainWindow(), true).showDialog(null);
}
throw new CaseActionException(Bundle.Case_exceptionMessage_contentProviderCouldNotBeFound());
}
if (CaseType.SINGLE_USER_CASE == metadata.getCaseType()) {
// only prefix with metadata directory if databaseName is a relative path
String fullDatabasePath = (new File(databaseName).isAbsolute())
? databaseName
: Paths.get(metadata.getCaseDirectory(), databaseName).toString();
caseDb = SleuthkitCase.openCase(fullDatabasePath, contentProvider);
caseDb = SleuthkitCase.openCase(metadata.getCaseDatabasePath(), contentProvider);
} else if (UserPreferences.getIsMultiUserModeEnabled()) {
caseDb = SleuthkitCase.openCase(databaseName, UserPreferences.getDatabaseConnectionInfo(), metadata.getCaseDirectory(), contentProvider);
} else {

View File

@ -29,16 +29,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@ -51,13 +43,10 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.openide.util.Lookup;
import org.sleuthkit.autopsy.coreutils.Version;
import org.sleuthkit.autopsy.coreutils.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
@ -121,7 +110,6 @@ public final class CaseMetadata {
private static final String SCHEMA_VERSION_SIX = "6.0";
private final static String CONTENT_PROVIDER_ELEMENT_NAME = "ContentProvider";
private final static String CONTENT_PROVIDER_NAME_ELEMENT_NAME = "Name";
private final static String CONTENT_PROVIDER_ARG_DEFAULT_KEY = "DEFAULT";
/*
* Unread fields, regenerated on save.
@ -136,7 +124,7 @@ public final class CaseMetadata {
private String caseName;
private CaseDetails caseDetails;
private String caseDatabaseName;
private String caseDatabasePath; // Legacy
private String caseDatabasePath;
private String textIndexName; // Legacy
private String createdDate;
private String createdByVersion;
@ -258,7 +246,9 @@ public final class CaseMetadata {
* @return The case directory.
*/
public String getCaseDirectory() {
return metadataFilePath.getParent().toString();
return StringUtils.isBlank(this.caseDatabasePath)
? metadataFilePath.getParent().toString()
: Paths.get(this.caseDatabasePath).getParent().toString();
}
/**
@ -637,6 +627,7 @@ public final class CaseMetadata {
this.textIndexName = getElementTextContent(caseElement, TEXT_INDEX_ELEMENT, false);
break;
default:
this.caseDatabasePath = getElementTextContent(caseElement, CASE_DB_ABSOLUTE_PATH_ELEMENT_NAME, false);
this.caseDatabaseName = getElementTextContent(caseElement, CASE_DB_NAME_RELATIVE_ELEMENT_NAME, true);
this.textIndexName = getElementTextContent(caseElement, TEXT_INDEX_ELEMENT, false);
break;
@ -650,11 +641,9 @@ public final class CaseMetadata {
*/
Path possibleAbsoluteCaseDbPath = Paths.get(this.caseDatabaseName);
Path caseDirectoryPath = Paths.get(getCaseDirectory());
if (possibleAbsoluteCaseDbPath.getNameCount() > 1) {
if (possibleAbsoluteCaseDbPath.toFile().isAbsolute()) {
this.caseDatabasePath = this.caseDatabaseName;
this.caseDatabaseName = caseDirectoryPath.relativize(possibleAbsoluteCaseDbPath).toString();
} else {
this.caseDatabasePath = caseDirectoryPath.resolve(caseDatabaseName).toAbsolutePath().toString();
}
} catch (ParserConfigurationException | SAXException | IOException ex) {
@ -719,12 +708,12 @@ public final class CaseMetadata {
* @return The full path to the case database file for a single-user case.
*
* @throws UnsupportedOperationException If called for a multi-user case.
* @deprecated Do not use.
*/
@Deprecated
public String getCaseDatabasePath() throws UnsupportedOperationException {
if (Case.CaseType.SINGLE_USER_CASE == caseType) {
return Paths.get(getCaseDirectory(), caseDatabaseName).toString();
return StringUtils.isBlank(this.caseDatabasePath)
? this.metadataFilePath.getParent().resolve(this.caseDatabaseName).toString()
: this.caseDatabasePath;
} else {
throw new UnsupportedOperationException();
}

View File

@ -0,0 +1,12 @@
MultiUserCaseBrowserCustomizer.column.caseDbDeleteStatus=Base de datos de casos eliminada
MultiUserCaseBrowserCustomizer.column.caseDirDeleteStatus=Directorio de casos eliminado
MultiUserCaseBrowserCustomizer.column.createTime=Crear tiempo
MultiUserCaseBrowserCustomizer.column.dataSourcesDeleteStatus=Fuentes de datos eliminadas
MultiUserCaseBrowserCustomizer.column.directory=Directorio
MultiUserCaseBrowserCustomizer.column.displayName=Nombre
MultiUserCaseBrowserCustomizer.column.lastAccessTime=Ultimo tiempo de acceso
MultiUserCaseBrowserCustomizer.column.manifestFileZNodesDeleteStatus=Znodes del manifiesto eliminados
MultiUserCaseBrowserCustomizer.column.textIndexDeleteStatus=Indice de texto eliminado
MultiUserCaseNode.column.createTime=Falso
MultiUserCaseNode.columnValue.true=Verdadero
MultiUserCasesBrowserPanel.waitNode.message=Por favor, espere....

View File

@ -0,0 +1,31 @@
OptionsCategory_Name_TagNamesOptions=Etiquetas Personalizadas
OptionsCategory_TagNames=Nombres de Etiqueta
TagNameDefinition.predefTagNames.bookmark.text=Marcador
TagNameDefinition.predefTagNames.followUp.text=Seguimiento
TagNameDefinition.predefTagNames.notableItem.text=Elemento Notable
TagNameDialog.descriptionLabel.text=Descripcion:
TagNameDialog.editTitle.text=Editar Etiqueta
TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.message=Las descripciones de etiquetas no pueden contener comas (,) ni puntos y comas (;)
TagNameDialog.JOptionPane.tagDescriptionIllegalCharacters.title=Caracter no valido en la descripcion de la etiqueta
TagNameDialog.notableCheckbox.text=La etiqueta indica que el elemento es notable.
TagNameDialog.title.text=Nueva Etiqueta
TagNameDialog.JOptionPane.tagNameIllegalCharacters.message=El nombre de la etiqueta no puede contener ninguno de los siguientes simbolos: \\ : * ? " < > | , ;
TagNameDialog.JOptionPane.tagNameIllegalCharacters.title=Caracter no valido en el nombre de la etiqueta
TagNameDialog.JOptionPane.tagNameEmpty.message=El nombre de la etiqueta no puede estar vacio
TagNameDialog.JOptionPane.tagNameEmpty.title=Nombre de etiqueta vacio
TagOptionsPanel.deleteTagNameButton.text=Eliminar Etiqueta
TagOptionsPanel.descriptionLabel.text=Descripcion de la Etiqueta:
TagOptionsPanel.editTagNameButton.text=Editar Etiqueta
TagOptionsPanel.ingestRunningWarningLabel.text=No se pueden realizar cambios en las etiquetas existentes cuando el proceso de ingestion esta en ejecucion!
TagOptionsPanel.isNotableLabel.text=La etiqueta indica que el elemento es notable:
TagOptionsPanel.newTagNameButton.text=Nueva Etiqueta
TagOptionsPanel.notableYesOrNoLabel.text=
TagOptionsPanel.panelDescriptionTextArea.text=Crear y gestionar etiquetas. Las etiquetas se pueden aplicar a archivos y resultados en el caso. Las etiquetas destacadas haran que los elementos etiquetados con ellas sean marcados como notables al utilizar un repositorio central. Cambiar el estado de una etiqueta solo afectara a los elementos en el caso actual..
TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message=El nombre de la etiqueta debe ser unico. Ya existe una etiqueta con este nombre..
TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title=Nombre de Etiqueta Duplicado
TagOptionsPanel.tagTypesListLabel.text=Nombres de Etiqueta:
TagNameDialog.okButton.text=Aceptar
TagNameDialog.cancelButton.text=Cancelar
TagNameDialog.tagNameTextField.text=
TagNameDialog.newTagNameLabel.text=Nombre:
TagsManager.notableTagEnding.text=\ (Notable)

View File

@ -0,0 +1,11 @@
AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoComment=Agregar/Editar Comentario del Repositorio Central
AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoCommentEmptyFile=Agregar/Editar Comentario del Repositorio Central (Archivo Vacio)
AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoCommentNoMD5=Agregar/Editar Comentario del Repositorio Central (Sin Hash MD5)
CentralRepoCommentDialog.title.addEditCentralRepoComment=Agregar/Editar Comentario del Repositorio Central
OpenIDE-Module-Name=Repositorio Central
OpenIDE-Module-Display-Category=Modulo de Ingesta
OpenIDE-Module-Short-Description=Modulo de Ingesta del Repositorio Central
OpenIDE-Module-Long-Description=Modulo de ingestion del Repositorio Central y base de datos central. \n\nEl modulo de ingesta del repositorio central almacena los atributos de los artefactos que coinciden con los tipos de correlacion seleccionados en una base de datos central.\nLos atributos almacenados se utilizan en casos futuros para correlacionar y analizar archivos y artefactos durante la ingesta.
CentralRepoCommentDialog.commentLabel.text=Comentario:
CentralRepoCommentDialog.okButton.text=&OK
CentralRepoCommentDialog.cancelButton.text=C&ancel

View File

@ -0,0 +1,8 @@
OtherOccurrences.csvHeader.attribute=Coincidencia atributo
OtherOccurrences.csvHeader.case=Caso
OtherOccurrences.csvHeader.comment=Comentario
OtherOccurrences.csvHeader.dataSource=Fuente de datos
OtherOccurrences.csvHeader.device=Dispositivo
OtherOccurrences.csvHeader.known=Conocido
OtherOccurrences.csvHeader.path=Ruta
OtherOccurrences.csvHeader.value=Valor del atributo

View File

@ -0,0 +1,47 @@
DataContentViewerOtherCases.table.toolTip.text=Haga clic en el nombre de la columna para ordenar. Haga clic derecho en la tabla para mas opciones..
DataContentViewerOtherCases.title=Otras ocurrencias
DataContentViewerOtherCases.toolTip=Muestra instancias del archivo/artefacto seleccionado de otras ocurrencias..
OccurrencePanel.caseCreatedDateLabel.text=Fecha de creacion:
OccurrencePanel.caseDetails.text=Detalles del caso
OccurrencePanel.caseNameLabel.text=Nombre:
OccurrencePanel.commonProperties.text=Propiedades comunes
OccurrencePanel.commonPropertyCommentLabel.text=Comentario:
OccurrencePanel.commonPropertyKnownStatusLabel.text=Estado conocido:
OccurrencePanel.commonPropertyTypeLabel.text=Tipo:
OccurrencePanel.commonPropertyValueLabel.text=Valor:
OccurrencePanel.dataSourceDetails.text=Detalles de la fuente de datos
OccurrencePanel.dataSourceNameLabel.text=Nombre:
OccurrencePanel.fileDetails.text=Detalles del archivo
OccurrencePanel.filePathLabel.text=Ruta del archivo:
OtherOccurrencesCasesTableModel.case=Caso
OtherOccurrencesCasesTableModel.noData=Sin datos.
OtherOccurrencesDataSourcesTableModel.dataSourceName=Nombre de la fuente de datos
OtherOccurrencesDataSourcesTableModel.noData=Sin datos.
OtherOccurrencesFilesTableModel.fileName=Nombre del archivo
OtherOccurrencesFilesTableModel.noData=Sin datos.
OtherOccurrencesPanel.caseDatasourceFileSplitPane.toolTipText=
OtherOccurrencesPanel.caseDetailsDialog.noCaseNameError=Error
OtherOccurrencesPanel.caseDetailsDialog.noDetails=Sin detalles para este caso.
OtherOccurrencesPanel.caseDetailsDialog.noDetailsReference=Sin detalles del caso para propiedades de referencia global.
OtherOccurrencesPanel.caseDetailsDialog.notSelected=Ninguna fila seleccionada
# {0} - commonality percentage
# {1} - correlation type
# {2} - correlation value
OtherOccurrencesPanel.correlatedArtifacts.byType={0}% de fuentes de datos tienen {2} (tipo: {1})\n
OtherOccurrencesPanel.correlatedArtifacts.failed=Error al obtener detalles de frecuencia.
OtherOccurrencesPanel.correlatedArtifacts.isEmpty=No hay archivos o artefactos para correlacionar.
OtherOccurrencesPanel.correlatedArtifacts.title=Frecuencia de atributo
OtherOccurrencesPanel.earliestCaseLabel.toolTipText=
OtherOccurrencesPanel.earliestCaseLabel.text=Fecha de inicio del Repositorio Central:
OtherOccurrencesPanel.earliestCaseDate.text=Fecha de caso mas temprana
OtherOccurrencesPanel.foundIn.text=Se encontraron %d instancias en %d casos y %d fuentes de datos.
OtherOccurrencesPanel.foundInLabel.text=
OtherOccurrencesPanel.filesTable.toolTipText=Haga clic en el nombre de la columna para ordenar. Haga clic derecho en la tabla para mas opciones..
OtherOccurrencesPanel.exportToCSVMenuItem.text=Exportar todas las otras ocurrencias a CSV
OtherOccurrencesPanel.noOpenCase.errMsg=Ningun caso abierto disponible.
OtherOccurrencesPanel.showCommonalityMenuItem.text=Mostrar frecuencia
OtherOccurrencesPanel.showCaseDetailsMenuItem.text=Mostrar detalles del caso
OtherOccurrencesPanel.table.noArtifacts=El articulo no tiene atributos con los que buscar.
OtherOccurrencesPanel.table.noResultsFound=No se encontraron resultados.
OtherOccurrencesPanel_earliestCaseNotAvailable=No disponible.
OtherOccurrencesPanel_table_loadingResults=Cargando resultados

View File

@ -0,0 +1,56 @@
# {0} - majorVersion
AbstractSqlEamDb.badMajorSchema.message=Valor incorrecto para la version del esquema ({0}) - la base de datos esta corrupta.
# {0} - minorVersion
AbstractSqlEamDb.badMinorSchema.message=Valor incorrecto para la version menor del esquema ({0}) - la base de datos esta corrupta.
# {0} - platformName
AbstractSqlEamDb.cannotUpgrage.message=La plataforma de base de datos seleccionada "{0}" no puede ser actualizada.
AbstractSqlEamDb.failedToReadMajorVersion.message=Error al leer la version del esquema del Repositorio Central.
AbstractSqlEamDb.failedToReadMinorVersion.message=Error al leer la version menor del esquema del Repositorio Central.
AbstractSqlEamDb.upgradeSchema.incompatible=El Repositorio Central seleccionado no es compatible con la version actual de la aplicacion, por favor actualiza la aplicacion si deseas utilizar este Repositorio Central.
CentralRepoDbChoice.Disabled.Text=Desactivado
CentralRepoDbChoice.PostgreSQL.Text=PostgreSQL Personalizado
CentralRepoDbChoice.PostgreSQL_Multiuser.Text=PostgreSQL utilizando configuraciones multiusuario
CentralRepoDbChoice.Sqlite.Text=SQLite
CentralRepoDbManager.connectionErrorMsg.text=Error al conectar con la base de datos del repositorio central.
CentralRepositoryService.progressMsg.startingListener=Iniciando el escuchador de eventos...
CentralRepositoryService.progressMsg.updatingSchema=Comprobando actualizaciones del esquema...
CentralRepositoryService.progressMsg.waitingForListeners=Finalizando la adicion de datos a la base de datos del repositorio central....
CentralRepositoryService.serviceName=Servicio de Repositorio Central
CorrelationAttributeInstance.invalidName.message=Nombre de tabla de base de datos no valido. El nombre debe empezar con una letra minuscula y solo puede contener letras minusculas, numeros y '_'.
CorrelationAttributeInstance.nullName.message=El nombre de la base de datos es nulo.
CorrelationAttributeUtil.emailaddresses.text=Direcciones de correo electronico
CorrelationType.DOMAIN.displayName=Dominio
CorrelationType.EMAIL.displayName=Direccion de correo electronico
CorrelationType.FILES.displayName=MD5 del archivo
CorrelationType.ICCID.displayName=Numero ICCID
CorrelationType.IMEI.displayName=Numero IMEI
CorrelationType.IMSI.displayName=Numero IMSI
CorrelationType.MAC.displayName=Direccion MAC
CorrelationType.OS_ACCOUNT.displayName=Cuenta de SO
CorrelationType.PHONE.displayName=Numero de telefono
CorrelationType.PROG_NAME.displayName=Programa instalado
CorrelationType.SSID.displayName=Red inalambrica
CorrelationType.USBID.displayName=Dispositivo USB
EamArtifactInstances.knownStatus.bad=Incorrecto
EamArtifactInstances.knownStatus.known=Conocido
EamArtifactInstances.knownStatus.unknown=Desconocido
EamCase.title.caseDisplayName=Nombre del caso:
EamCase.title.caseNumber=Numero de caso
EamCase.title.caseUUID=UUID del caso:
EamCase.title.creationDate=Fecha de creacion:
EamCase.title.examinerEmail=Correo del Examinador:
EamCase.title.examinerName=Nombre del Examinador:
EamCase.title.examinerPhone=Telefono del Examinador:
EamCase.title.notes=Notas:
EamCase.title.org=Organizacion:
EamDbUtil.centralRepoConnectionFailed.message=No es posible conectar al Repositorio Central.
EamDbUtil.centralRepoDisabled.message=\ El Repositorio Central ha sido deshabilitado.
EamDbUtil.centralRepoUpgradeFailed.message=No se pudo actualizar el Repositorio Central.
EamDbUtil.exclusiveLockAquisitionFailure.message=No es posible adquirir bloqueo exclusivo para el Repositorio Central.
Persona.defaultName=Sin nombre
PostgresEamDb.centralRepoDisabled.message=El modulo del Repositorio Central no esta habilitado.
PostgresEamDb.connectionFailed.message=Error al obtener conexion a la base de datos.
PostgresEamDb.multiUserLockError.message=Error al adquirir bloqueo de base de datos
SqliteEamDb.centralRepositoryDisabled.message=El modulo del Repositorio Central no esta habilitado.
SqliteEamDb.connectionFailedMessage.message=Error al obtener conexion a la base de datos.
SqliteEamDb.databaseMissing.message=Falta la base de datos del repositorio central.

View File

@ -0,0 +1,8 @@
caseeventlistener.evidencetag=Evidencia
CentralRepositoryNotificationDialog.bulletHeader=Estos datos son utilizados para:
CentralRepositoryNotificationDialog.bulletOne=Ignorar elementos comunes (archivos, dominios y cuentas)
CentralRepositoryNotificationDialog.bulletThree=Crear personajes que agrupan cuentas
CentralRepositoryNotificationDialog.bulletTwo=Identificar donde se vio previamente un elemento
CentralRepositoryNotificationDialog.finalRemarks=Para limitar lo que se almacena, usa el panel de opciones del Repositorio Central.
CentralRepositoryNotificationDialog.header=Autopsy almacena datos sobre cada caso en su Repositorio Central.
Installer.centralRepoUpgradeFailed.title=Repositorio central deshabilitado

View File

@ -0,0 +1,30 @@
CentralRepoIngestModule_artifact_type_inbox_msg_header=Tipo de Artefacto
CentralRepoIngestModule_cannotGetCrCaseErrMsg=Caso no presente en el repositorio central
CentralRepoIngestModule_cannotGetCrDataSourceErrMsg=Fuente de datos no presente en el repositorio central
CentralRepoIngestModule_crDatabaseTypeMismatch=Los casos de multiples usuarios requieren un repositorio central de PostgreSQL
CentralRepoIngestModule_crInaccessibleErrMsg=Error al acceder al repositorio central
CentralRepoIngestModule_crNotEnabledErrMsg=Se requiere repositorio central, pero no está habilitado
CentralRepoIngestModule_filename_inbox_msg_header=Nombre del Archivo
CentralRepoIngestModule_md5Hash_inbox_msg_header=MD5 Hash
CentralRepoIngestModule_missingFileCorrAttrTypeErrMsg=Tipo de atributo de correlacion para archivos no encontrado en el repositorio central
CentralRepoIngestModule_noCurrentCaseErrMsg=Error al obtener el caso actual
CentralRepoIngestModule_notable_attr_inbox_msg_header=Atributo notable
# {0} - Name of item that is Notable
CentralRepoIngestModule_notable_inbox_msg_subject=Notable: {0}
# {0} - list of cases
CentralRepoIngestModule_notableJustification=Marcado previamente como notable en casos {0}
CentralRepoIngestModule_notableSetName=Marcado previamente como notable (Repositorio Central)
CentralRepoIngestModule_prev_cases_inbox_msg_header=Casos anteriores
# {0} - list of cases
CentralRepoIngestModule_prevSeenJustification=Visto previamente en casos {0}
CentralRepoIngestModule_prevSeenOsAcctConfig=Usuarios vistos previamente (Repositorio Central)
CentralRepoIngestModule_prevSeenOsAcctSetName=Usuarios vistos en casos anteriores
CentralRepoIngestModule_prevSeenSetName=Visto previamente (Repositorio Central)
CentralRepoIngestModule_prevUnseenJustification=Visto previamente en cero casos
CentralRepoIngestModuleFactory.ingestmodule.desc=Guarda propiedades en el repositorio central para una correlación posterior
CentralRepoIngestModuleFactory.ingestmodule.name=Repositorio Central
IngestSettingsPanel.ingestSettingsLabel.text=Configuraciones de Ingesta
IngestSettingsPanel.flagTaggedNotableItemsCheckbox.text=Etiqueta elementos marcados previamente como notables
IngestSettingsPanel.flagPreviouslySeenDevicesCheckbox.text=Etiqueta dispositivos y usuarios vistos previamente en otros casos
IngestSettingsPanel.createCorrelationPropertiesCheckbox.text=Guardar elementos en el Repositorio Central
IngestSettingsPanel.flagUniqueAppsCheckbox.text=Etiqueta aplicaciones y dominios no vistos en otros casos

View File

@ -0,0 +1,157 @@
AddNewOrganizationDialog.addNewOrg.msg=Aniadir nueva organizacion
AddNewOrganizationDialog.bnOk.addFailed.text=Error al agregar nueva organizacion.
AddNewOrganizationDialog.validation.incompleteFields=Se requiere el nombre de la organizacion.
CasesTableModel.case=Nombre del caso
CasesTableModel.creationDate=Fecha de creacion
CasesTableModel.noData=No hay casos
DataSourcesTableModel.dataSource=Nombre de la fuente de datos
DataSourcesTableModel.deviceId=ID del dispositivo
DataSourcesTableModel.noData=No hay fuentes de datos
EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=La ruta de la base de datos seleccionada no es valida. Intente nuevamente.
EamDbSettingsDialog.fcDatabasePath.title=Seleccionar ubicacion para central_repository.db
EamDbSettingsDialog.lbDatabaseType.text=Tipo de base de datos :
EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite solo debe ser utilizado por un examinador a la vez.
EamDbSettingsDialog.okButton.connectionErrorMsg.text=Error al conectar con la base de datos del repositorio central.
EamDbSettingsDialog.okButton.corruptDatabaseExists.message=La base de datos del repositorio central existe pero no es el formato correcto. Eliminela manualmente o elija una ruta diferente (si corresponde).
EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error al cargar la base de datos del repositorio central
EamDbSettingsDialog.okButton.createDbDialog.message=La base de datos del repositorio central no existe, ¿desea crearla?
EamDbSettingsDialog.okButton.createDbDialog.title=La base de datos del repositorio central no existe
EamDbSettingsDialog.okButton.createDbError.title=No se puede crear la base de datos del repositorio central
EamDbSettingsDialog.okButton.createPostgresDbError.message=No se puede crear la base de datos del repositorio central de Postgres, asegurese de que la direccion, el puerto y las credenciales de inicio de sesion sean correctas para el servidor de Postgres e intente nuevamente.
EamDbSettingsDialog.okButton.createSQLiteDbError.message=No se puede crear la base de datos del repositorio central de SQLite, asegurese de que la ubicacion exista y tenga permisos de escritura e intente nuevamente.
EamDbSettingsDialog.okButton.databaseConnectionFailed.message=No se puede conectar con la base de datos del repositorio central. Verifique su configuracion e intente nuevamente.
EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Fallo en la conexion con la base de datos del repositorio central
EamDbSettingsDialog.okButton.errorMsg.text=Por favor, reinicie Autopsy para comenzar a usar la nueva plataforma de base de datos.
EamDbSettingsDialog.okButton.errorTitle.text=Reinicio requerido.
EamDbSettingsDialog.textPrompt.dbName=Nombre de la base de datos
EamDbSettingsDialog.textPrompt.hostnameOrIP=Nombre de host o direccion IP
EamDbSettingsDialog.textPrompt.password=Contrasenia del usuario de la base de datos
EamDbSettingsDialog.textPrompt.port=Numero de puerto
EamDbSettingsDialog.textPrompt.user=Usuario de base de datos
EamDbSettingsDialog.title.text=Configuracion de base de datos del repositorio central
EamDbSettingsDialog.validation.finished=Haga clic en Aceptar para guardar la configuracion de su base de datos y volver a las opciones. O seleccione un tipo de base de datos diferente..
EamDbSettingsDialog.validation.incompleteFields=Complete todos los valores para la base de datos seleccionada..
EamOptionsController.moduleErr=Error procesando cambios de valor..
EamOptionsController.moduleErr.msg=Error en el procesamiento del cambio de valor..
GlobalSettingsPanel.askForCentralRepoDbChoice.customPostgrestChoice.text=Configurar PostgreSQL
GlobalSettingsPanel.askForCentralRepoDbChoice.disableChoice.text=Desactivar el Repositorio Central
GlobalSettingsPanel.askForCentralRepoDbChoice.sqliteChoice.text=Usar SQLite
GlobalSettingsPanel.onMultiUserChange.disabledMu.description=El Repositorio Central se reconfigurara para utilizar una base de datos local SQLite..
GlobalSettingsPanel.onMultiUserChange.disabledMu.description2=Presione Configurar PostgreSQL para cambiar a una base de datos PostgreSQL..
GlobalSettingsPanel.onMultiUserChange.disabledMu.title=Cambio necesario en el Repositorio Central
# {0} - server name
GlobalSettingsPanel.onMultiUserChange.enable.description=¿Desea actualizar el Repositorio Central para usar el servidor PostgreSQL en {0}?
GlobalSettingsPanel.onMultiUserChange.enable.description2=Cualquier dato en un Repositorio Central SQLite existente no se transferira a la nueva base de datos..
GlobalSettingsPanel.onMultiUserChange.enable.title=Repositorio Central
GlobalSettingsPanel.testCurrentConfiguration.dbDoesNotExist.message=La base de datos no existe..
GlobalSettingsPanel.validationErrMsg.ingestRunning=No puede cambiar la configuracion mientras se esta ejecutando el proceso de ingestion..
GlobalSettingsPanel.validationerrMsg.mustConfigure=Configure la base de datos para habilitar este modulo..
ManageCasesDialog.title.text=Administrar Casos
ManageCorrelationPropertiesDialog.noneSelected=No hay propiedades de correlacion habilitadas..
ManageCorrelationPropertiesDialog.okbutton.failure=Error al guardar las selecciones actualizadas..
ManageCorrelationPropertiesDialog.title=Administrar Propiedades de Correlacion
ManageOrganizationsDialog.closeButton.text=Cerrar
ManageOrganizationsDialog.confirmDeletion.message=¿Esta seguro de que desea eliminar la organizacion seleccionada del repositorio central?
ManageOrganizationsDialog.confirmDeletion.title=Confirmar Eliminacion
ManageOrganizationsDialog.deleteButton.text=Eliminar
ManageOrganizationsDialog.editButton.text=Editar
ManageOrganizationsDialog.newButton.text=Nuevo
ManageOrganizationsDialog.orgDescriptionTextArea.text=Las organizaciones se utilizan para proporcionar informacion de contacto adicional para el contenido con el que estan asociadas..
ManageOrganizationsDialog.orgDetailsLabel.text=Detalles de la Organizacion
ManageOrganizationsDialog.orgListLabel.text=Organizaciones
ManageOrganizationsDialog.orgNameLabel.text=Nombre de la Organizacion:
ManageOrganizationsDialog.pocEmailLabel.text=Correo Electronico del Punto de Contacto:
ManageOrganizationsDialog.pocNameLabel.text=Nombre del Punto de Contacto:
ManageOrganizationsDialog.pocPhoneLabel.text=Telefono del Punto de Contacto:
ManageOrganizationsDialog.title.text=Administrar Organizaciones
ManageOrganizationsDialog.unableToDeleteOrg.message=Incapaz de eliminar organizacion seleccionada.
ManageOrganizationsDialog.unableToDeleteOrg.title=Incapaz de Eliminar
OptionsCategory_Name_Central_Repository_Options=Repositorio Central
OptionsCategory_Keywords_Central_Repository_Options=Configuracion del Repositorio Central
ImportHashDatabaseDialog.known.text=Conocido
ImportHashDatabaseDialog.knownBad.text=Destacable
EamPostgresSettingsDialog.lbUserPassword.text=Contrasenia de Usuario :
EamPostgresSettingsDialog.lbUserName.text=Nombre de Usuario :
EamPostgresSettingsDialog.bnCancel.text=Cancelar
EamPostgresSettingsDialog.lbPort.text=Puerto :
EamPostgresSettingsDialog.lbHostName.text=Nombre de Anfitrion / IP :
EamPostgresSettingsDialog.bnTestConnection.text=Probar Conexion
EamPostgresSettingsDialog.lbDatabaseName.text=Nombre de la Base de Datos :
EamSqliteSettingsDialog.bnCancel.text=Cancelar
EamSqliteSettingsDialog.lbTestDatabase.text=
EamSqliteSettingsDialog.bnTestDatabase.text=Probar Conexion
EamSqliteSettingsDialog.lbTestDatabaseWarning.text=
EamSqliteSettingsDialog.bnDatabasePathFileOpen.text=Navegar...
EamSqliteSettingsDialog.tfDatabasePath.toolTipText=Nombre de Archivo y Ruta para guardar el archivo db de SQLite
EamSqliteSettingsDialog.tfDatabasePath.text=
EamSqliteSettingsDialog.lbDatabasePath.text=Ruta de la Base de Datos :
ImportHashDatabaseDialog.tfDatabaseName.tooltip=Nombre para este conjunto de hash
ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=Numero de Version del Conjunto de Hash
ImportHashDatabaseDialog.tfDatabaseName.tooltip=Nombre para este conjunto de hash
ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=Numero de Version del Conjunto de Hash
GlobalSettingsPanel.tbOops.text=
GlobalSettingsPanel.lbDatabaseSettings.text=Configuracion de la Base de Datos
GlobalSettingsPanel.bnImportDatabase.label=Importar Conjunto de Hash
AddNewOrganizationDialog.lbPocPhone.text=Telefono:
AddNewOrganizationDialog.lbPocEmail.text=Correo Electronico:
AddNewOrganizationDialog.lbPocName.text=Nombre:
AddNewOrganizationDialog.lbPocHeading.text=Punto de Contacto:
AddNewOrganizationDialog.lbOrganizationName.text=Nombre de la Organizacion:
AddNewOrganizationDialog.bnCancel.text=Cancelar
AddNewOrganizationDialog.bnOK.text=Aceptar
AddNewOrganizationDialog.tfName.tooltip=Nombre del PdC (Punto de Contacto)
ManageTagsDialog.okButton.text=Aceptar
ManageTagsDialog.cancelButton.text=Cancelar
ManageArtifactTypesDialog.taInstructionsMsg.text=Habilitar una o mas propiedades de correlacion para usar durante la ingestion. Ten en cuenta que estas propiedades son globales y afectan a todos los usuarios del Repositorio Central..
EamSqliteSettingsDialog.bnOk.text=Aceptar
EamPostgresSettingsDialog.bnSave.text=Guardar
EamDbSettingsDialog.bnDatabasePathFileOpen.text=Navegar...
EamDbSettingsDialog.tfDatabasePath.toolTipText=Nombre de Archivo y Ruta para guardar el archivo db de SQLite
EamDbSettingsDialog.tfDatabasePath.text=
EamDbSettingsDialog.lbDatabasePath.text=Ruta de la Base de Datos :
EamDbSettingsDialog.bnCancel.text=Cancelar
EamDbSettingsDialog.bnOk.text=Aceptar
EamDbSettingsDialog.lbHostName.text=Nombre de Host / IP :
EamDbSettingsDialog.lbUserPassword.text=Contrasenia de Usuario :
EamDbSettingsDialog.lbUserName.text=Nombre de Usuario :
EamDbSettingsDialog.lbPort.text=Puerto :
GlobalSettingsPanel.pnDatabaseConfiguration.title=Configuracion de la Base de Datos
GlobalSettingsPanel.lbDbPlatformTypeLabel.text=Tipo:
GlobalSettingsPanel.lbDbNameLabel.text=Nombre:
GlobalSettingsPanel.bnDbConfigure.text=Configurar
GlobalSettingsPanel.lbDbLocationLabel.text=Ubicacion:
ManageCorrelationPropertiesDialog.lbWarningMsg.text=Mensaje de Advertencia
ManageCorrelationPropertiesDialog.cancelButton.text=Cancelar
ManageCorrelationPropertiesDialog.okButton.text=Aceptar
GlobalSettingsPanel.bnManageProperties.text=Administrar Propiedades de Correlacion
EamDbSettingsDialog.lbDatabaseDesc.text=Archivo de Base de Datos:
GlobalSettingsPanel.cbUseCentralRepo.text=Utilizar un Repositorio Central
GlobalSettingsPanel.organizationTextArea.text=La informacion de la organizacion puede ser rastreada en el Repositorio Central.
GlobalSettingsPanel.manageOrganizationButton.text=Administrar Organizaciones
GlobalSettingsPanel.lbCentralRepository.text=Un Repositorio Central te permite correlacionar archivos y resultados entre casos. La configuracion del Repositorio Central no puede modificarse mientras un caso esta abierto..
GlobalSettingsPanel.pnCorrelationProperties.border.title=Propiedades de Correlacion
GlobalSettingsPanel.organizationPanel.border.title=Organizaciones
GlobalSettingsPanel.casesPanel.border.title=Detalles del Caso
GlobalSettingsPanel.showCasesButton.text=Administrar Casos
ShowCasesDialog.closeButton.AccessibleContext.accessibleName=Cerrar
ShowCasesDialog.closeButton.actionCommand=Cerrar
ShowCasesDialog.closeButton.text=Cerrar
ShowCasesDialog.caseDetailsTable.toolTipText=Haz clic en el nombre de la columna para ordenar. Haz clic derecho en la tabla para mas opciones..
ShowCasesDialog.title=Detalles del Caso
GlobalSettingsPanel.Case\ Details.AccessibleContext.accessibleName=Detalles de los Casos
ShowCasesDialog.caseDetailsTable.AccessibleContext.accessibleDescription=Haz clic en el nombre de la columna para ordenar.
GlobalSettingsPanel.casesTextArea.text=Mostrar tabla que lista los detalles del caso en el Repositorio Central.
GlobalSettingsPanel.ingestRunningWarningLabel.text=¡No se pueden realizar cambios en la configuracion del Repositorio Central mientras la ingestion esta en curso!
GlobalSettingsPanel.correlationPropertiesTextArea.text=Elige que propiedades de archivo y resultado almacenar en el Repositorio Central para una correlacion posterior.\n
ManageCasesDialog.examinerPhoneLabel.text=Telefono del Examinador:
ManageCasesDialog.examinerNameLabel.text=Nombre del Examinador:
ManageCasesDialog.examinerEmailLabel.text=Correo Electronico del Examinador:
ManageCasesDialog.caseNumberLabel.text=Numero de Caso:
ManageCasesDialog.orgLabel.text=Organizacion:
ManageCasesDialog.closeButton.text=Cerrar
ManageCasesDialog.notesLabel.text=Notas:
ManageCasesDialog.dataSourcesLabel.text=Fuentes de Datos:
ManageCasesDialog.caseInfoLabel.text=Informacion del Caso:
GlobalSettingsPanel.bnTestConfigure.text=Prueba
GlobalSettingsPanel.testStatusLabel.toolTipText=
GlobalSettingsPanel.testStatusLabel.text=

View File

@ -0,0 +1,137 @@
AddMetadataDialog.title.text=Agregar Metadatos
AddMetadataDialog_dup_msg=Ya se ha agregado una entrada de metadatos con este nombre a esta persona.
AddMetadataDialog_dup_Title=Fallo al agregar metadatos
AddMetadataDialog_empty_name_msg=Una entrada de metadatos no puede tener un nombre o valor vacio.
AddMetadataDialog_empty_name_Title=Campos faltantes
CreatePersonaAccountDialog.title.text=Crear cuenta
CreatePersonaAccountDialog_error_msg=Error al crear la cuenta.
CreatePersonaAccountDialog_error_title=Fallo de la cuenta
CreatePersonaAccountDialog_invalid_account_msg=El identificador de la cuenta no es valido.
CreatePersonaAccountDialog_invalid_account_Title=Identificador de cuenta invalido
CreatePersonaAccountDialog_success_msg=Cuenta agregada.
CreatePersonaAccountDialog_success_title=Cuenta agregada
CTL_OpenPersonas=Personas
CTL_PersonasTopComponentAction=Personas
CTL_PersonaDetailsTopComponent=Detalles de la persona
OpenPersonasAction.displayName=Personas
PersonaAccountDialog.title.text=Agregar cuenta
PersonaAccountDialog_dup_msg=Esta cuenta ya esta agregada a la persona.
PersonaAccountDialog_dup_Title=Fallo al agregar la cuenta
PersonaAccountDialog_get_types_exception_msg=Fallo al acceder al repositorio central.
PersonaAccountDialog_get_types_exception_Title=Fallo del repositorio central
PersonaAccountDialog_identifier_empty_msg=El campo de identificacion no puede estar vacio.
PersonaAccountDialog_identifier_empty_Title=Identificador vacio
PersonaAccountDialog_invalid_account_msg=El identificador de la cuenta no es valido.
PersonaAccountDialog_invalid_account_Title=Identificador de cuenta invalido
PersonaAccountDialog_search_empty_msg=Cuenta no encontrada para el identificador y tipo dados.
PersonaAccountDialog_search_empty_Title=Cuenta no encontrada
PersonaAccountDialog_search_failure_msg=Fallo en la busqueda de cuentas del repositorio central.
PersonaAccountDialog_search_failure_Title=Fallo al agregar la cuenta
PersonaAliasDialog.title.text=Agregar Alias
PersonaAliasDialog_dup_msg=Este alias ya ha sido agregado a la persona.
PersonaAliasDialog_dup_Title=Fallo al agregar el alias
PersonaAliasDialog_empty_msg=Un alias no puede estar vacio.
PersonaAliasDialog_empty_Title=Alias vacio
PersonaDetailsDialog.cancelBtn.text=Cancelar
PersonaDetailsDialog.okBtn.text=Aceptar
PersonaDetailsDialogCreateTitle=Crear Persona
PersonaDetailsDialogEditTitle=Editar Persona
PersonaDetailsDialogViewTitle=Ver Persona
PersonaDetailsPanel.casesLbl.text=Casos encontrados en:
PersonaDetailsPanel.deleteAliasBtn.text=Eliminar
PersonaDetailsPanel.addAliasBtn.text=Agregar
PersonaDetailsPanel.aliasesLabel.text=Alias:
PersonaDetailsPanel.deleteMetadataBtn.text=Eliminar
PersonaDetailsPanel.addMetadataBtn.text=Agregar
PersonaDetailsPanel.metadataLabel.text=Metadatos:
PersonaDetailsPanel.deleteAccountBtn.text=Eliminar
PersonaDetailsPanel.addAccountBtn.text=Agregar
PersonaDetailsPanel.accountsLbl.text=Cuentas:
PersonaDetailsPanel.nameField.text=
PersonaDetailsPanel.nameLbl.text=Nombre:
AddAliasDialog.accountsLbl.text=Cuenta:
AddAliasDialog.okBtn.text=Aceptar
AddAliasDialog.cancelBtn.text=Cancelar
PersonaDetailsPanel.casesLbl.text=Casos encontrados en
PersonaDetailsPanel.deleteAliasBtn.text=Eliminar
PersonaDetailsPanel.addAliasBtn.text=Agregar
PersonaDetailsPanel.aliasesLabel.text=Alias
PersonaDetailsPanel.deleteMetadataBtn.text=Eliminar
PersonaDetailsPanel.addMetadataBtn.text=Agregar
PersonaDetailsPanel.metadataLabel.text=Metadatos
PersonaDetailsPanel.deleteAccountBtn.text=Eliminar
PersonaDetailsPanel.addAccountBtn.text=Agregar
PersonaDetailsPanel.accountsLbl.text=Cuentas
PersonaDetailsPanel.commentField.text=
PersonaDetailsPanel.commentLbl.text=Comentario:
PersonaDetailsPanel.nameLbl.text=Nombre:
PersonaDetailsPanel.examinerLbl.text=Creado por:
PersonaDetailsPanel.examinerField.text=
PersonaDetailsPanel.creationDateLbl.text=Creado en:
PersonaDetailsPanel.creationDateField.text=
PersonaAccountDialog.confidenceLbl.text=Confianza:
PersonaAccountDialog.justificationTextField.text=
PersonaAccountDialog.justificationLbl.text=Justificacion:
PersonaAccountDialog.typeLbl.text=Tipo:
PersonaAccountDialog.identifierTextField.text=
PersonaAccountDialog.identiferLbl.text=Identificador:
PersonaAccountDialog.okBtn.text=Aceptar
PersonaAccountDialog.cancelBtn.text=Cancelar
PersonaAliasDialog.cancelBtn.text_1=Cancelar
PersonaAliasDialog.confidenceLbl.text=Confianza:
PersonaAliasDialog.justificationTextField.text=
PersonaAliasDialog.justificationLbl.text=Justificacion:
PersonaAliasDialog.aliasTextField.text=
PersonaAliasDialog.aliasLbl.text=Alias:
PersonaAliasDialog.okBtn.text_1=Aceptar
PersonaDetailsPanel_CentralRepoErr_msg=Fallo al escribir en el repositorio central.
PersonaDetailsPanel_CentralRepoErr_Title=Fallo del repositorio central
PersonaDetailsPanel_empty_justification_msg=El campo de justificacion no puede estar vacio
PersonaDetailsPanel_empty_justification_Title=Justificacion vacia
PersonaDetailsPanel_EmptyComment_msg=El comentario de la persona no puede estar vacio.
PersonaDetailsPanel_EmptyComment_Title=Comentario de persona vacio
PersonaDetailsPanel_EmptyName_msg=El nombre de la persona no puede estar vacio.
PersonaDetailsPanel_EmptyName_Title=Nombre de persona vacio
PersonaDetailsPanel_load_exception_msg=Error al cargar la persona.
PersonaDetailsPanel_load_exception_Title=Fallo de inicializacion
PersonaDetailsPanel_NotEnoughAccounts_msg=Una persona necesita al menos una cuenta.
PersonaDetailsPanel_NotEnoughAccounts_Title=Cuenta faltante
PersonaMetadataDialog.confidenceLbl.text=Confianza:
PersonaMetadataDialog.justificationTextField.text=
PersonaMetadataDialog.justificationLbl.text=Justificacion:
PersonaMetadataDialog.valueTextField.text=
PersonaMetadataDialog.valueLbl.text=Valor:
PersonaMetadataDialog.nameTextField.text=
PersonaMetadataDialog.nameLbl.text=Nombre:
PersonaMetadataDialog.okBtn.text=Aceptar
PersonaMetadataDialog.cancelBtn.text=Cancelar
PersonaDetailsPanel.editAccountBtn.text=Editar
PersonaDetailsPanel.editMetadataBtn.text=Editar
PersonaDetailsPanel.editAliasBtn.text=Editar
PersonasTopComponent.searchAccountRadio.text=Cuenta
PersonasTopComponent.searchNameRadio.text=Nombre
PersonasTopComponent.searchField.text=
PersonasTopComponent.deleteBtn.text=Eliminar Persona
PersonasTopComponent.editBtn.text=Editar Persona
PersonasTopComponent.createBtn.text=Nueva Persona
PersonasTopComponent.createAccountBtn.text=Crear cuenta
PersonasTopComponent.searchBtn.text=Mostrar
PersonasTopComponent.resultsTable.columnModel.title1=Nombre
PersonasTopComponent.resultsTable.columnModel.title0=ID
PersonasTopComponent.resultsTable.toolTipText=
CreatePersonaAccountDialog.cancelBtn.text=Cancelar
CreatePersonaAccountDialog.typeLbl.text=Tipo:
CreatePersonaAccountDialog.identifierTextField.text=
CreatePersonaAccountDialog.identiferLbl.text=Identificador:
CreatePersonaAccountDialog.okBtn.text=Aceptar
PersonasTopComponent.introText.text=Las personas representan una identidad en linea. Se abarcan casos y se almacenan en el Repositorio Central en funcion de las cuentas que se encontraron en artefactos. Puedes crear, editar y eliminar personas aqui..
PersonasTopComponent.cbFilterByKeyword.text=Filtrar personas por nombre o cuenta
PersonaDetailsPanel.nameField.text=
PersonasTopComponent_delete_confirmation_msg=¿Estas seguro de que deseas eliminar esta persona?
PersonasTopComponent_delete_confirmation_Title=¿Estas seguro?
PersonasTopComponent_delete_exception_msg=Fallo al eliminar la persona.
PersonasTopComponent_delete_exception_Title=Fallo al eliminar
PersonasTopComponent_Name=Personas
PersonasTopComponent_noCR_msg=El Repositorio Central no esta habilitado.
PersonasTopComponent_search_exception_msg=Fallo en la busqueda de personas.
PersonasTopComponent_search_exception_Title=Hubo un fallo durante la busqueda. Intenta abrir un caso para inicializar completamente la base de datos del repositorio central..

View File

@ -0,0 +1,23 @@
CommandLineIngestSettingPanel_empty_report_name_mgs=Nombre del perfil de informe estaba vacio, no se creo ningun perfil.
CommandLineIngestSettingPanel_existing_report_name_mgs=Nombre del perfil de informe ya existe, no se creo ningun perfil.
CommandLineIngestSettingPanel_invalid_report_name_mgs=Nombre del perfil de informe contenia caracteres no permitidos, no se creo ningun perfil.
CommandListIngestSettingsPanel_Default_Report_DisplayName=Predeterminado
CommandListIngestSettingsPanel_Make_Config=Crear nuevo perfil...
CommandListIngestSettingsPanel_Report_Name_Msg=Por favor proporciona un nombre de perfil de informe (solo letras, digitos y caracteres de subrayado):
OpenIDE-Module-Name=CommandLineAutopsy
OptionsCategory_Keywords_Command_Line_Ingest_Settings=Configuracion de Ingesta de Linea de Comando
OptionsCategory_Keywords_General=Opciones
OptionsCategory_Name_Command_Line_Ingest=Ingesta de Linea de Comando
CommandLinePanel.jLabel1.text=Ejecutando tarea de linea de comando.
CommandLineStartupWindow.title.text=Ejecutando en Modo de Linea de Comando
CommandLineIngestSettingsPanel.bnEditIngestSettings.text=Configurar
CommandLineIngestSettingsPanel.bnEditReportSettings.actionCommand=Configuracion del Modulo de Informes
CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText=Configuracion de generacion de informes para el contexto del modo de procesamiento de linea de comando.
CommandLineIngestSettingsPanel.bnEditReportSettings.text=Configurar
CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText=Configuracion del trabajo de Ingesta para el contexto del modo de procesamiento de linea de comando.
CommandLineIngestSettingsPanel.ingestDescriptionTextPane.text=Configurar los perfiles para usar desde la linea de comando.
CommandLineIngestSettingsPanel.reportDescriptionTextPane.text=Los perfiles de informe definen que modulo de informe y configuracion utilizar.
CommandLineIngestSettingsPanel.reportProfileLabel.text=Perfil de Informe:
CommandLineIngestSettingsPanel.ingestProfileLabel.text=Perfil de Ingesta:
CommandLineIngestSettingsPanel.bnEditReportSettings.AccessibleContext.accessibleName=Configurar
CommandLineIngestSettingsPanel.jTextPane1.text=Los perfiles de ingesta definen que filtros, modulos y configuracion de ingesta utilizar.

View File

@ -0,0 +1,116 @@
AbstractCommonFilesMetadataBuilder.buildCategorySelectionString.all=Todas las Categorias de Archivos
AbstractCommonFilesMetadataBuilder.buildCategorySelectionString.doc=Documentos
AbstractCommonFilesMetadataBuilder.buildCategorySelectionString.media=Medios
# {0} - threshold percent
AbstractCommonFilesMetadataBuilder.getPercentFilter.thresholdPercent=, Umbral {0}%
# {0} - attr type
# {1} - threshold string
AllInterCaseCommonAttributeSearcher.buildTabTitle.titleInterAll=Propiedades Comunes (Todos los Casos del Repositorio Central, {0}{1})
# {0} - build category
# {1} - threshold string
AllIntraCaseCommonAttributeSearcher.buildTabTitle.titleIntraAll=Propiedades Comunes (Todas las Fuentes de Datos, {0}{1})
# {0} - number of datasources
CommonAttributePanel.dataSourcesLabel.text=El Repositorio Central actual contiene {0} fuente(s) de datos.
CommonAttributePanel.exception=Excepcion Inesperada cargando Fuentes de Datos.
CommonAttributePanel.frame.title=Encontrar Propiedades Comunes
CommonAttributePanel.incompleteResults.continueText=\n\n ¿Continuar con la busqueda de todas formas?
CommonAttributePanel.incompleteResults.introText=Los resultados pueden estar incompletos. No todas las fuentes de datos en el caso actual fueron ingresadas en el Repositorio Central actual. Las siguientes fuentes de datos no han sido procesadas:
CommonAttributePanel.incompleteResults.title=La busqueda puede estar incompleta
CommonAttributePanel.intraCasePanel.title=Opciones del Caso Actual
CommonAttributePanel.search.done.exception=Excepcion Inesperada ejecutando Encontrar Propiedades Comunes.
CommonAttributePanel.search.done.interupted=Algo salio mal al encontrar propiedades comunes.
CommonAttributePanel.search.done.noCurrentCaseException=No se puede abrir el archivo del caso.
CommonAttributePanel.search.done.noResults=No se encontraron resultados.
CommonAttributePanel.search.done.searchProgressDisplay=Mostrando Resultados de Propiedades Comunes.
CommonAttributePanel.search.done.searchProgressGathering=Recopilando Resultados de Propiedades Comunes.
CommonAttributePanel.search.done.sqlException=No se pueden consultar las propiedades o fuentes de datos en la base de datos.
CommonAttributePanel.search.done.tskCoreException=No se puede ejecutar la consulta contra la base de datos.
CommonAttributePanel.search.results.pathText=Resultados de Propiedades Comunes
CommonAttributePanel.setupCases.done.exeutionException=Excepcion Inesperada cargando casos.
CommonAttributePanel.setupCases.done.interruptedException=Algo salio mal al construir el cuadro de dialogo de busqueda de Archivos Comunes.
CommonAttributePanel.setupDataSources.done.exception=Excepcion Inesperada cargando fuentes de datos.
CommonAttributePanel.setupDataSources.done.interupted=Algo salio mal al construir el cuadro de dialogo de busqueda de Archivos Comunes.
CommonAttributePanel.setupDataSources.done.noCurrentCaseException=No se puede abrir el archivo del caso.
CommonAttributePanel.setupDataSources.done.sqlException=No se pueden consultar las fuentes de datos en la base de datos.
CommonAttributePanel.setupDataSources.done.tskCoreException=No se puede ejecutar la consulta contra la base de datos.
CommonAttributePanel.setupDataSources.updateUi.noDataSources=No se encontraron fuentes de datos.
CommonAttributePanel.title=Panel de Propiedades Comunes
CommonAttributeSearchAction.getName.text=Encontrar Propiedades Comunes
CommonAttributeSearchAction.openPanel.caseNotInCentralRepo=\n - El caso actual no esta en el Repositorio Central.
CommonAttributeSearchAction.openPanel.centralRepoDisabled=\n - El Repositorio Central esta deshabilitado.
CommonAttributeSearchAction.openPanel.centralRepoInvalid=\n - La configuracion del Repositorio Central es invalida.
CommonAttributeSearchAction.openPanel.intro=La caracteristica de encontrar propiedades comunes no esta disponible porque:
CommonAttributeSearchAction.openPanel.noCaseOpen=\n - Ningun caso esta abierto.
CommonAttributeSearchAction.openPanel.notEnoughCases=\n - Menos de 2 casos existen en el Repositorio Central.
CommonAttributeSearchAction.openPanel.notEnoughDataSources=\n - No hay multiples fuentes de datos en el caso actual.
CommonAttributeSearchAction.openPanel.resolution=\n\nAborda uno de estos problemas para habilitar esta funcion.
CommonAttributeValueNode.CommonAttributeValueNode.format=Valor: %s
CommonFilesNode.getName.text=Archivos Comunes
CommonFilesPanel.commonFilesSearchLabel.text=<html>Encuentra archivos en multiples fuentes de datos en el caso actual.</html>
CommonFilesPanel.text=Indica que fuentes de datos considerar al buscar duplicados:
CommonFilesPanel.jRadioButton1.text=jRadioButton1
CommonFilesPanel.jRadioButton2.text=Entre el caso actual y casos en el Repositorio Central
CommonFilesPanel.intraCaseRadio.label=Correlaciona solo dentro del caso actual
CommonFilesPanel.interCaseRadio.label=Correlaciona entre todos los casos conocidos (usa el Repositorio Central)
CommonFilesSearchResultsViewerTable.caseColLbl=Caso
CommonFilesSearchResultsViewerTable.dataSourceColLbl=Fuente de Datos
CommonFilesSearchResultsViewerTable.instancesColLbl=Instancias
CommonFilesSearchResultsViewerTable.localPath=Ruta Principal en el Caso Actual
CommonFilesSearchResultsViewerTable.noDescText=\
CommonFilesSearchResultsViewerTable.pathColLbl=Ruta Principal
CommonFilesSearchResultsViewerTable.valueColLbl=Valor
InstanceCountNode.createSheet.noDescription=\
InstanceCountNode.displayName=Existe en %s fuentes de datos (%s)
IntraCasePanel.selectDataSourceComboBox.actionCommand=
CommonAttributePanel.jCheckBox1.text=Ocultar archivos encontrados en mas de
CommonAttributePanel.jLabel1.text=% de fuentes de datos en repositorio central.
CommonAttributePanel.percentageThresholdCheck.text_1=Ocultar archivos encontrados en mas de
CommonAttributePanel.jCheckBox1.text=Ocultar archivos encontrados en mas de
CommonAttributePanel.jLabel1.text=% de fuentes de datos en repositorio central.
CommonAttributePanel.percentageThreshold.text=20
CommonAttributePanel.jLabel1.text_1=% de fuentes de datos en repositorio central.
InterCasePanel.correlationTypeComboBox.toolTipText=Tipo de correlacion seleccionada
IntraCasePanel.selectedFileCategoriesButton.text=Solo los tipos de archivo seleccionados:
IntraCasePanel.categoriesLabel.text=Tipos de archivo a mostrar:
IntraCasePanel.allFileCategoriesRadioButton.toolTipText=No se aplican filtros a los resultados...
IntraCasePanel.allFileCategoriesRadioButton.text=Todos los tipos de archivo
IntraCasePanel.documentsCheckbox.text=Documentos
IntraCasePanel.pictureVideoCheckbox.text=Imagenes y videos
IntraCasePanel.selectedFileCategoriesButton.toolTipText=Selecciona entre las opciones a continuacion...
CommonAttributePanel.percentageThresholdTextTwo.text_1=% de fuentes de datos en Repositorio Central.
CommonAttributePanel.percentageThresholdCheck.text_1_1=Ocultar elementos encontrados en mas de
CommonAttributePanel.intraCaseRadio.text=Entre fuentes de datos en el caso actual
CommonAttributePanel.errorText.text=<html>Para realizar una busqueda, debes seleccionar una categoria de archivo.</html>
CommonAttributePanel.searchButton.text=Buscar
InterCasePanel.categoriesLabel.text=Tipos de archivo a mostrar:
InterCasePanel.documentsCheckbox.text=Documentos
InterCasePanel.pictureVideoCheckbox.text=Imagenes y videos
InterCasePanel.selectedFileCategoriesButton.toolTipText=Selecciona entre las opciones a continuacion...
InterCasePanel.selectedFileCategoriesButton.text=Solo los tipos de archivo seleccionados:
InterCasePanel.allFileCategoriesRadioButton.toolTipText=No se aplican filtros a los resultados...
InterCasePanel.allFileCategoriesRadioButton.text=Todos los tipos de archivo
InterCasePanel.specificCentralRepoCaseCheckbox.text=Los elementos comunes deben existir en un caso especifico:
IntraCasePanel.onlySpecificDataSourceCheckbox.text=Los elementos comunes deben existir en una fuente de datos especifica:
CommonAttributePanel.interCasePanel.border.title=Opciones de Repositorio Central
CommonAttributePanel.intraCasePanel.border.title=Opciones del caso actual
CommonAttributePanel.commonItemSearchDescription.text=<html>Encontrar elementos que existan en multiples fuentes de datos o casos</html>
CommonAttributePanel.scopeLabel.text=Alcance de la busqueda:
InterCasePanel.correlationComboBoxLabel.text=Tipo de propiedad a comparar:
CommonAttributePanel.percentageThresholdInputBox.text=20
CommonAttributePanel.resultsDisplayLabel.text_2=Mostrar resultados organizados por:
CommonAttributePanel.organizeByCaseRadio.text=Caso
CommonAttributePanel.organizeByCountRadio.text=Numero de ocurrencias
CommonAttributePanel.caseResultsRadioButton.text=Caso
CommonAttributePanel.countResultsRadioButton.text=Numero de fuentes de datos
CommonAttributePanel.displayResultsLabel.text_2=Mostrar resultados organizados por:
# {0} - case name
# {1} - attr type
# {2} - threshold string
SingleInterCaseCommonAttributeSearcher.buildTabTitle.titleInterSingle=Propiedades Comunes (Repositorio Central Caso: {0}, {1}{2})
# {0} - data source name
# {1} - build category
# {2} - threshold string
SingleIntraCaseCommonAttributeSearcher.buildTabTitle.titleIntraSingle=Propiedades Comunes (Fuente de Datos: {0}, {1}{2})
UserInputErrorManager.categories=No se incluyen categorias de archivo en la busqueda.
UserInputErrorManager.frequency=Porcentaje de frecuencia invalido: 0 < % < 100.
ValueNode.createSheet.noDescription=\

View File

@ -0,0 +1,100 @@
AccountNode.accountName=Cuenta
AccountNode.accountType=Tipo
AccountNode.device=Dispositivo
AccountNode.messageCount=Articulos
applyText=Aplicar
CTL_OpenCVTAction=Comunicaciones
CVTTopComponent.name=\ Visualizacion de Comunicaciones
CVTTopComponent.TabConstraints.tabTitle=Visualizar
CVTTopComponent.accountsBrowser.TabConstraints.tabTitle=Navegar
FiltersPanel.applyFiltersButton.text=Aplicar
FiltersPanel.devicesLabel.text=Dispositivos:
FiltersPanel.accountTypesLabel.text=Tipos de Cuenta:
FiltersPanel.filtersTitleLabel.text=Filtros
FiltersPanel.unCheckAllAccountTypesButton.text=Desmarcar Todo
FiltersPanel.checkAllAccountTypesButton.text=Marcar Todo
FiltersPanel.unCheckAllDevicesButton.text=Desmarcar Todo
FiltersPanel.checkAllDevicesButton.text=Marcar Todo
FiltersPanel.dateRangeLabel.text=Rango de Fechas:
FiltersPanel.startCheckBox.text=Inicio:
FiltersPanel.endCheckBox.text=Fin:
FiltersPanel.refreshButton.text=Actualizar
FiltersPanel.deviceRequiredLabel.text=Seleccionar al menos uno.
FiltersPanel.accountTypeRequiredLabel.text=Seleccionar al menos uno.
FiltersPanel.needsRefreshLabel.text=Los datos mostrados pueden estar desactualizados. Presiona Actualizar para actualizarlos..
OpenCVTAction.displayName=Comunicaciones
PinAccountsAction.pluralText=Agregar Cuentas Seleccionadas a la Visualizacion
PinAccountsAction.singularText=Agregar Cuenta Seleccionada a la Visualizacion
refreshText=Actualizar Resultados
ResetAndPinAccountsAction.pluralText=Visualizar Solo Cuentas Seleccionadas
ResetAndPinAccountsAction.singularText=Visualizar Solo Cuenta Seleccionada
UnpinAccountsAction.pluralText=Eliminar Cuentas Seleccionadas
UnpinAccountsAction.singularText=Eliminar Cuenta Seleccionada
VisalizationPanel.paintingError=Problema al pintar la visualizacion.
# {0} - default name
VisualizationPane_accept_defaultName=El nombre del informe estaba vacio. Presiona Aceptar para aceptar el nombre del informe predeterminado.: {0}
VisualizationPane_blank_report_title=Nombre del Informe en Blanco
VisualizationPane_DisplayName=Abrir Informe
VisualizationPane_fileName_prompt=Ingresa un nombre para el Informe de Instantaneas de Comunicaciones:
VisualizationPane_MessageBoxTitle=Error al Abrir Informe
VisualizationPane_MissingReportFileMessage=El archivo del informe ya no existe..
VisualizationPane_NoAssociatedEditorMessage=No hay un editor asociado para informes de este tipo o la aplicacion asociada no se pudo iniciar..
VisualizationPane_NoOpenInEditorSupportMessage=Esta plataforma (sistema operativo) no admite abrir un archivo en un editor de esta manera..
VisualizationPane_Open_Report=Abrir Informe
# {0} - report name
VisualizationPane_overrite_exiting=¿Sobrescribir informe existente?\n{0}
VisualizationPane_Report_OK_Button=Aceptar
# {0} - report path
VisualizationPane_Report_Success=Informe creado exitosamente en:\n{0}
VisualizationPane_ReportFileOpenPermissionDeniedMessage=Permiso denegado para abrir el archivo del informe.
VisualizationPane_reportName=Instantanea de Comunicaciones
VisualizationPanel.cancelButton.text=Cancelar
VisualizationPanel.computingLayout=Calculando Diseño
VisualizationPanel.jButton1.text=Organico Rapido
CVTTopComponent.vizPanel.TabConstraints.tabTitle=Visualizar
CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1=Navegar
CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName=Visualizar
CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualizar
VisualizationPanel.fitGraphButton.text=
VisualizationPanel.fitZoomButton.toolTipText=Ajustar visualizacion al espacio disponible.
VisualizationPanel.fitZoomButton.text=
# {0} - layout name
VisualizationPanel.layoutFail.text={0} Fallo en el diseño. Prueba un diseño diferente..
# {0} - layout name
VisualizationPanel.layoutFailWithLockedVertices.text={0} Fallo en el diseño con vertices bloqueados. Desbloquea algunos vertices o prueba un diseño diferente..
VisualizationPanel.lockAction.pluralText=Bloquear Cuentas Seleccionadas
VisualizationPanel.lockAction.singularText=Bloquear Cuenta Seleccionada
VisualizationPanel.unlockAction.pluralText=Desbloquear Cuentas Seleccionadas
VisualizationPanel.unlockAction.singularText=Desbloquear Cuenta Seleccionada
VisualizationPanel.zoomActualButton.toolTipText=Restaurar zoom predeterminado de la visualizacion.
VisualizationPanel.zoomActualButton.text=
VisualizationPanel.zoomInButton.toolTipText=Acercar visualizacion.
VisualizationPanel.zoomInButton.text=
VisualizationPanel.zoomOutButton.toolTipText=Alejar visualizacion.
VisualizationPanel.zoomOutButton.text=
VisualizationPanel.fastOrganicLayoutButton.text=
VisualizationPanel.backButton.text_1=
VisualizationPanel.circleLayoutButton.text=Circulo
VisualizationPanel.organicLayoutButton.text=Organico
VisualizationPanel.hierarchyLayoutButton.text=Jerarquico
VisualizationPanel.clearVizButton.text_1=
VisualizationPanel.snapshotButton.text_1=Informe de Instantaneas
VisualizationPanel.clearVizButton.actionCommand=
VisualizationPanel.backButton.toolTipText=Haz clic para volver al estado anterior.
VisualizationPanel.forwardButton.toolTipText=Haz clic para avanzar al siguiente estado.
VisualizationPanel.fastOrganicLayoutButton.toolTipText=Haz clic para redibujar la visualizacion.
VisualizationPanel.clearVizButton.toolTipText=Haz clic para borrar la visualizacion.
FiltersPanel.limitHeaderLabel.text=Limite de Comunicaciones:
FiltersPanel.mostRecentLabel.text=Mas Reciente:
FiltersPanel.limitErrorMsgLabel.text=Valor entero no valido.
VisualizationPanel.forwardButton.text=
VisualizationPanel.zoomPercentLabel.text=100%
VisualizationPanel.zoomLabel.text=Zoom:
VisualizationPanel.snapshotButton.toolTipText=Generar Informe de Instantaneas.
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filtros
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filtros
VisualizationPanel.jTextPane1.text=Haz clic derecho en una cuenta en la tabla de Navegar Cuentas y selecciona "Visualizar" para comenzar.
VisualizationPanel_action_dialogs_title=Comunicaciones
VisualizationPanel_action_name_text=Informe de Instantaneas
VisualizationPanel_module_name=Comunicaciones
VisualizationPanel_snapshot_report_failure=Informe de instantaneas no creado. Ocurrio un error durante la creacion..

View File

@ -0,0 +1,95 @@
CallLogViewer_device_label=Dispositivo
CallLogViewer_duration_label=Duracion (segundos)
CallLogViewer_noCallLogs=<No se encontraron registros de llamadas para la cuenta seleccionada>
CallLogViewer_recipient_label=Para/Desde
CallLogViewer_title=Registros de llamadas
ContactDetailsPane.nameLabel.text=Marcador de posicion
ContactNode_Email=Direccion de correo electronico
ContactNode_Home_Number=Numero de casa
ContactNode_Mobile_Number=Numero movil
ContactNode_Name=Nombre
ContactNode_Office_Number=Numero de oficina
ContactNode_Phone=Numero de telefono
ContactNode_URL=URL
ContactsViewer_columnHeader_Email=Correo electronico
ContactsViewer_columnHeader_Name=Nombre
ContactsViewer_columnHeader_Phone=Telefono
ContactsViewer_noContacts_message=<No se encontraron contactos para la cuenta seleccionada>
ContactsViewer_tabTitle=Contactos
MediaViewer_Name=Adjuntos multimedia
MediaViewer_selection_failure_msg=Error al obtener adjuntos multimedia para las cuentas seleccionadas.
MediaViewer_selection_failure_title=Fallo en la seleccion
MessageNode_Node_Property_Attms=Recuento de adjuntos
MessageNode_Node_Property_Date=Fecha
MessageNode_Node_Property_From=De
MessageNode_Node_Property_Subject=Asunto
MessageNode_Node_Property_To=Para
MessageNode_Node_Property_Type=Tipo
MessageViewer_columnHeader_Attms=Adjuntos
MessageViewer_columnHeader_Date=Fecha
MessageViewer_columnHeader_EarlyDate=Mensaje mas temprano
MessageViewer_columnHeader_From=De
MessageViewer_columnHeader_Subject=Asunto
MessageViewer_columnHeader_To=Para
MessageViewer_no_messages=<No se encontraron mensajes para la cuenta seleccionada>
MessageViewer_tabTitle=Mensajes
MessageViewer_viewMessage_all=Todos
MessageViewer_viewMessage_calllogs=Registros de llamadas
MessageViewer_viewMessage_selected=Seleccionados
MessageViewer_viewMessage_unthreaded=No enhebrado
# {0} - PersonaAccount count
RelationshipsNodeUtilities_Tooltip_suffix=(1 de {0})
# {0} - Contact Name
# {1} - Persona Name
RelationshipsNodeUtilities_Tooltip_Template=Contacto: {0} - Persona: {1}
# {0} - accountIdentifer
SummaryPersonaPane_not_account_in_cr=No se pudo encontrar una cuenta con el identificador {0} en el Repositorio Central.
SummaryViewer.countsPanel.border.title=Comunicaciones
OutlineViewPanel.messageLabel.text=<Control deshabilitado>
SummaryViewer.messagesDataLabel.text=mensajes
SummaryViewer.callLogsDataLabel.text=registros de llamadas
SummaryViewer.contactsDataLabel.text=contactos
SummaryViewer.messagesLabel.text=Mensajes:
SummaryViewer.callLogsLabel.text=Registros de llamadas:
SummaryViewer_Account_Description=Esta cuenta representa un dispositivo en el caso.
SummaryViewer_Account_Description_MuliSelect=La informacion de resumen no esta disponible cuando se seleccionan varias cuentas.
SummaryViewer_CaseRefNameColumn_Title=Nombre del caso
SummaryViewer_CentralRepository_Message=<Habilitar Repositorio Central para ver Otras Ocurrencias>
SummaryViewer_Country_Code=Pais:
SummaryViewer_Creation_Date_Title=Fecha de creacion
SummaryViewer_Device_Account_Description=Esta cuenta fue referenciada por un dispositivo en el caso.
SummaryViewer_Fetching_References=<Obteniendo Referencias de Archivos>
SummaryViewer_FileRef_Message=<Seleccione una sola cuenta para ver las Referencias de Archivos>
SummaryViewer_FileRefNameColumn_Title=Ruta
SummaryViewer_loading_count_message=Cargando....
SummaryViewer_Persona_CR_Message=<Habilitar Repositorio Central para ver Personas>
SummaryViewer_Select_account_for_persona=<Seleccione una sola cuenta para ver Persona(s)>
SummaryViewer_TabTitle=Resumen
ThreadRootMessagePanel.showAllCheckBox.text=Mostrar Todos los Mensajes
ThreadPane.backButton.text=<---
SummaryViewer.caseReferencesPanel.border.title=Otras Ocurrencias
MessageViewer.threadsLabel.text=Seleccione un Hilo para Ver
MessageViewer.threadNameLabel.text=<Nombre del hilo>
MessageViewer.showingMessagesLabel.text=Mostrando Mensajes para el Hilo:
MessageViewer.backButton.AccessibleContext.accessibleDescription=
MessageViewer.backButton.text=Hilos
MessageViewer.showAllButton.text=Todos los Mensajes
SummaryViewer.thumbnailCntLabel.text=Adjuntos multimedia:
SummaryViewer.thumbnailsDataLabel.text=adjuntos
SummaryViewer.attachmentDataLabel.text=recuento
SummaryViewer.accountLabel.text=<nombre de la cuenta>
SummaryViewer.contanctsPanel.border.title=Contactos de la Cuenta
SummaryViewer.accoutDescriptionLabel.text=<descripcion de la cuenta>
SummaryViewer.attachmentsLabel.text=Adjuntos Totales:
SummaryViewer.referencesLabel.text=Referencias de Comunicacion:
SummaryViewer.referencesDataLabel.text=<recuento de referencias>
SummaryViewer.contactsLabel.text=Entradas de Agenda:
SummaryViewer.accountCountry.text=<pais de la cuenta>
SummaryViewer.fileRefPane.border.title=Referencias de Archivos en el Caso Actual
SummaryViewer.selectAccountFileRefLabel.text=<Seleccione una sola cuenta para ver Referencias de Archivos>
SummaryViewer.personaPanel.border.title=Personas
PersonaPanel.personaIDLabel.text=jLabel1
SummaryPersonaPane.noPersonaLabel.text=No se encontraron personas
SummaryPersonaPane.messageLabel.text=<Habilitar Repositorio Central para crear y ver personas>
SummaryPersonaPane.createButton.text=Crear
PersonaPanel.viewButton.text=Ver

View File

@ -0,0 +1,955 @@
# Copyright 2014-2020 Basis Technology Corp.
#
# Copyright 2006-2017 ICEsoft Technologies Canada Corp.
#
# 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.
#
ApplicationContentViewer.title=Aplicacion
ApplicationContentViewer.toolTip=Muestra el contenido del archivo.
FXVideoPanel.pauseButton.infoLabel.playbackErr=No se puede reproducir el video.
FXVideoPanel.progress.bufferingCancelled=Se cancelo el almacenamiento en bufer de medios
FXVideoPanel.progress.bufferingInterrupted=El almacenamiento en bufer de medios fue interrumpido
FXVideoPanel.progress.errorWritingVideoToDisk=Error escribiendo video en disco
FXVideoPanel.mediaPane.infoLabel=Playback de videos eliminados no es soportado, usar reproductor externo.
FXVideoPanel.progress.bufferingFile=Almacenando en bufer {0}
FXVideoPanel.progressLabel.buffering=Almacenando en bufer...
FXVideoPanel.media.unsupportedFormat=Formato no compatible.
GstVideoPanel.cannotProcFile.err=El reproductor multimedia no puede procesar este archivo.
GstVideoPanel.noOpenCase.errMsg=No hay caso abierto disponible.
Html_text_display_error=El HTML text no puede ser mostrado, puede que no sea correctamente formado HTML.
HtmlPanel_showImagesToggleButton_hide=Ocultar Imagenes
HtmlPanel_showImagesToggleButton_show=Descargar Imagenes
HtmlViewer_encoding_error=Este archivo tiene encoding no soportado
HtmlViewer_file_error=Este archivo no se encuentra o no es legible.
MediaFileViewer.initGst.gstException.msg=Error inicializando gstreamer para visualizacion de audio/video y extraccion de frames. Visualizacion de video y audio sera deshabilitada.
GstVideoPanel.setupVideo.infoLabel.text=Playback de videos eliminados no es soportado, usar reproductor externo.
GstVideoPanel.exception.problemFile.msg=No se pueden capturar frames de este archivo ({0}).
GstVideoPanel.exception.problemPlay.msg=Problema con archivo de video; problema al intentar reproducir mientras se obtiene la duracion.
GstVideoPanel.exception.problemPause.msg=Problema con archivo de video; problema al intentar pausar mientras se obtiene la duracion.
GstVideoPanel.exception.problemPauseCaptFrame.msg=Problema con archivo de video; problema al intentar pausar mientras se captura un frame.
GstVideoPanel.exception.problemPlayCaptFrame.msg=Problema con archivo de video; problema al intentar reproducir mientras se captura un frame.
GstVideoPanel.exception.problemStopCaptFrame.msg=Problema con archivo de video; problema al intentar detener mientras se captura un frame.
GstVideoPanel.progress.buffering=Almacenando en bufer...
GstVideoPanel.progressLabel.bufferingErr=Error almacenando en bufer el archivo
GstVideoPanel.progress.infoLabel.updateErr=Error actualizando progreso del video: {0}
GstVideoPanel.ExtractMedia.progress.buffering=Almacenando en bufer {0}
MediaFileViewer.AccessibleContext.accessibleDescription=
MediaFileViewer.title=Medios
MediaFileViewer.toolTip=Muestra archivos multimedia soportados (imagenes, videos, audio)
MediaPlayerPanel.noSupport=Archivo no soportado.
MediaPlayerPanel.playbackDisabled=Se encontro un problema con el servicio de reproduccion de video y audio. Reproduccion de video y audio sera deshabilitada durante el resto de la sesion.
MediaPlayerPanel.timeFormat=%02d:%02d:%02d
MediaPlayerPanel.unknownTime=Desconocido
MediaViewImagePanel.createTagOption=Crear
MediaViewImagePanel.deleteTagOption=Eliminar
MediaViewImagePanel.errorLabel.OOMText=No se pudo cargar archivo en Media View: insuficiente memoria.
MediaViewImagePanel.errorLabel.text=No se pudo cargar archivo en Media View.
MediaViewImagePanel.exportSaveText=Guardar
MediaViewImagePanel.exportTagOption=Exportar
MediaViewImagePanel.externalViewerButton.text=Abrir en visor externo Ctrl+E
MediaViewImagePanel.fileChooserTitle=Elegir ubicacion de guardado
MediaViewImagePanel.hideTagOption=Ocultar
MediaViewImagePanel.successfulExport=Imagen etiquetada guardada exitosamente.
MediaViewImagePanel.unsuccessfulExport=No se puede exportar imagen etiquetada a disco.
MediaViewVideoPanel.pauseButton.text=\u25ba
MediaViewVideoPanel.progressLabel.text=00:00
MediaViewVideoPanel.infoLabel.text=Info
MediaViewImagePanel.imgFileTooLarge.msg=No se pudo cargar archivo de imagen (demasiado grande): {0}
Metadata.headerTitle=Metadatos
Metadata.nodeText.loading=Carga de metadatos...
Metadata.nodeText.none=Ninguno
Metadata.nodeText.truncated=(resultados truncados)
Metadata.nodeText.unknown=Desconocido
Metadata.tableRowTitle.acquisitionDetails=Detalles de adquisicion
Metadata.tableRowTitle.deviceId=ID de dispositivo
Metadata.tableRowTitle.downloadSource=Descargado desde
Metadata.tableRowTitle.imageType=Tipo
Metadata.tableRowTitle.mimeType=Tipo MIME
Metadata.tableRowTitle.name=Nombre
Metadata.tableRowTitle.sectorSize=Tamanio de sector
Metadata.tableRowTitle.sha1=SHA1
Metadata.tableRowTitle.sha256=SHA-256
Metadata.tableRowTitle.size=Tamanio
Metadata.tableRowTitle.fileNameAlloc=Asignacion de nombre de archivo
Metadata.tableRowTitle.metadataAlloc=Asignacion de metadatos
Metadata.tableRowTitle.modified=Modificado
Metadata.tableRowTitle.accessed=Accedido
Metadata.tableRowTitle.created=Creado
Metadata.tableRowTitle.changed=Cambiado
Metadata.tableRowContent.md5notCalc=No calculado
Metadata.tableRowTitle.md5=MD5
Metadata.tableRowTitle.hashLookupResults=Resultados de busqueda de hash
Metadata.tableRowTitle.internalid=ID interno
Metadata.tableRowTitle.localPath=Ruta local
Metadata.tableRowTitle.timezone=Zona horaria
Metadata.tableRowTitle.type=Tipo
Metadata.title=Metadatos del archivo
Metadata.toolTip=Muestra metadatos sobre el archivo.
Metadata.nodeText.nonFilePassedIn=Se proporciono un elemento que no es un archivo
Metadata.nodeText.text=Desde The Sleuth Kit istat Tool:
Metadata.nodeText.exceptionNotice.text=Error al obtener metadatos del archivo:
MessageArtifactViewer.textbodyScrollPane.TabConstraints.tabTitle=Texto
JPEGViewerDummy.jLabel1.text=Estas viendo un archivo JPEG:
JPEGViewerDummy.jTextField1.text=jTextField1
Metadata_dataArtifactTitle=Metadatos del archivo de origen
MetadataWorker.doInBackground.noDataMsg=Sin datos
PDFViewer.encryptedDialog=Este documento esta protegido por contrasenia.
PDFViewer.errorDialog=Se produjo un error al abrir este documento PDF. Verifica los registros para obtener mas informacion. Puedes continuar usando esta funcion en otros documentos PDF..
PListNode.KeyCol=Clave
PListNode.TypeCol=Tipo
PListNode.ValueCol=Valor
PListViewer.DataType.message=Valor de datos binarios no mostrado
PListViewer.ExportFailed.message=Error en la exportacion del archivo Plist.
PListViewer.ExportSuccess.message=El archivo Plist se exporto correctamente
PListViewer.processPlist.errorMessage=Error al analizar/mostrar archivo plist.
PListViewer.processPlist.interruptedMessage=Interrupcion durante el analisis/mostrado de archivo plist.
SQLiteTableView.DisplayAs.text=Mostrar como
SQLiteTableView.DisplayAsMenuItem.Date=Fecha
SQLiteTableView.DisplayAsMenuItem.RawData=Datos sin procesar
SQLiteViewer.comboBox.noTableEntry=No se encontraron tablas
SQLiteViewer.csvExport.confirm.msg=¿Quieres sobrescribir el archivo existente?
SQLiteViewer.csvExport.fileName.empty=Por favor, ingresa un nombre de archivo para exportar.
SQLiteViewer.csvExport.title=Exportar a archivo CSV
SQLiteViewer.errorMessage.failedToExtractFile=No se pudo extraer el archivo de la fuente de datos.
SQLiteViewer.errorMessage.failedToinitJDBCDriver=No se pudo cargar el controlador JDBC para SQLite.
SQLiteViewer.errorMessage.failedToQueryDatabase=No se pudieron leer las tablas de la base de datos en el archivo.
SQLiteViewer.errorMessage.interrupted=Se interrumpio el procesamiento del archivo.
SQLiteViewer.errorMessage.noCurrentCase=El caso ha sido cerrado.
# {0} - exception message
SQLiteViewer.errorMessage.unexpectedError=Se produjo un error inesperado:\n{0).
SQLiteViewer.exportTableToCsv.FileName=Nombre de archivo:
SQLiteViewer.exportTableToCsv.TableName=Nombre de tabla:
SQLiteViewer.exportTableToCsv.write.errText=Error al exportar contenido de tabla a archivo CSV.
SQLiteViewer.nextPageButton.text=
SQLiteViewer.prevPageButton.text=
SQLiteViewer.numPagesLabel.text=N
SQLiteViewer.jLabel3.text=de
SQLiteViewer.currPageLabel.text=x
SQLiteViewer.jLabel2.text=Pagina
SQLiteViewer.numEntriesField.text=num Entradas
SQLiteViewer.jLabel1.text=Tabla
PListViewer.exportButton.text=Exportar
SQLiteViewer.exportCsvButton.text=Exportar a CSV
MediaViewImagePanel.rotateLeftButton.text=
MediaViewImagePanel.zoomInButton.text=
MediaViewImagePanel.rotateRightButton.text=
MediaViewImagePanel.zoomOutButton.text=
MediaViewImagePanel.zoomResetButton.text=Restablecer
MediaViewImagePanel.zoomTextField.text=
MediaViewImagePanel.rotationTextField.text=
MediaViewImagePanel.rotateLeftButton.toolTipText=
HtmlPanel.showImagesToggleButton.text=Descargar imagenes
MediaViewImagePanel.tagsMenu.text_1=Menu de etiquetas
MediaPlayerPanel.progressLabel.text=00:00:00/00:00:00
MediaPlayerPanel.audioSlider.toolTipText=
MediaPlayerPanel.rewindButton.text=
MediaPlayerPanel.fastForwardButton.text=
MediaPlayerPanel.playButton.text=
MediaPlayerPanel.infoLabel.text=Sin errores
MediaPlayerPanel.VolumeIcon.text=Volumen
MediaPlayerPanel.playBackSpeedLabel.text=Velocidad:
# The following message properties were taken from IcePDF 6.2.2 to allow
# for Japanese translation.
#
#####
### This MessageBundle contains English text for ICEpdf View and Pilot RI's
##
#
# {0} - tableName
SQLiteViewer.readTable.errorText=Error al obtener filas para la tabla: {0}
# {0} - tableName
SQLiteViewer.selectTable.errorText=Error al obtener cantidad de filas para la tabla: {0}
TranslatablePanel.comboBoxOption.originalText=Texto Original
TranslatablePanel.comboBoxOption.translatedText=Texto Traducido
# {0} - exception message
TranslatablePanel.onSetContentError.text=Se produjo un error al mostrar el texto: {0}
## Window toolbar Title
viewer.window.title.default=Visor ICEpdf
viewer.window.title.open.default=Visor ICEpdf - [{0}]
#status bar
viewer.statusbar.currentPage=Pagina {0} / {1}
viewer.common.number.one=1
viewer.common.number.two=2
viewer.common.number.three=3
viewer.common.number.four=4
viewer.common.number.five=5
viewer.common.number.six=6
viewer.common.number.seven=7
viewer.common.number.eight=8
viewer.common.number.nine=9
viewer.common.number.ten=10
viewer.common.number.eleven=11
viewer.common.number.twelve=12
viewer.common.number.thirteen=13
viewer.common.number.fourteen=14
viewer.common.number.fifteen=15
viewer.common.number.sixteen=16
viewer.common.number.seventeen=17
viewer.common.number.eighteen=18
viewer.common.number.nineteen=19
viewer.common.number.twenty=20
viewer.common.number.twentyOne=21
viewer.common.number.twentyTwo=22
viewer.common.number.twentyThree=23
viewer.common.number.twentyFour=24
viewer.common.number.twentyFive=25
viewer.common.number.twentySix=26
viewer.common.number.twentySeven=27
viewer.common.number.thirtySix=36
viewer.common.number.fortyEight=48
## Top Page Control Toolbar
viewer.toolbar.hideToolBar.label=Ocultar Barra de Herramientas
viewer.toolbar.showToolBar.label=Mostrar Barra de Herramientas
viewer.toolbar.showUtilityPane.label=Mostrar Panel de Utilidades
viewer.toolbar.hideUtilityPane.label=Ocultar Panel de Utilidades
viewer.toolbar.open.label=
viewer.toolbar.open.tooltip=Abrir Documento
viewer.toolbar.saveAs.label=Guardar Como
viewer.toolbar.saveAs.tooltip=Guardar Como...
viewer.toolbar.print.label=Imprimir
viewer.toolbar.print.tooltip=Imprimir Documento
viewer.toolbar.search.label=Buscar
viewer.toolbar.search.tooltip=Buscar en el Documento
viewer.toolbar.utilityPane.label=Panel de Utilidades
viewer.toolbar.utilityPane.tooltip=Mostrar/Ocultar Panel de Utilidades
viewer.toolbar.navigation.label=
viewer.toolbar.navigation.pages.tooltip=Numero de Paginas
viewer.toolbar.navigation.pages.firstPage.label=
viewer.toolbar.navigation.current.tooltip=Numero de Pagina Actual
viewer.toolbar.navigation.current.firstPage.label=
viewer.toolbar.navigation.firstPage.label=
viewer.toolbar.navigation.firstPage.tooltip=Primera Pagina
viewer.toolbar.navigation.previousPage.label=
viewer.toolbar.navigation.previousPage.tooltip=Pagina Anterior
viewer.toolbar.navigation.nextPage.label=
viewer.toolbar.navigation.nextPage.tooltip=Pagina Siguiente
viewer.toolbar.navigation.lastPage.label=
viewer.toolbar.navigation.lastPage.tooltip=ultima Pagina
viewer.toolbar.pageIndicator=de {0}
viewer.toolbar.zoom.label=
viewer.toolbar.zoom.tooltip=Zoom
viewer.toolbar.zoom.out.label=
viewer.toolbar.zoom.out.tooltip=Alejar
viewer.toolbar.zoom.in.label=
viewer.toolbar.zoom.in.tooltip=Acercar
viewer.toolbar.pageFit.actualsize.label=
viewer.toolbar.pageFit.actualsize.tooltip=Tamanio Real
viewer.toolbar.pageFit.fitWindow.label=
viewer.toolbar.pageFit.fitWindow.tooltip=Ajustar a la Ventana
viewer.toolbar.pageFit.fitWidth.label=
viewer.toolbar.pageFit.fitWidth.tooltip=Ajustar al Ancho
viewer.toolbar.rotation.left.label=
viewer.toolbar.rotation.left.tooltip=Girar a la Izquierda
viewer.toolbar.rotation.right.label=
viewer.toolbar.rotation.right.tooltip=Girar a la Derecha
viewer.toolbar.tool.pan.label=
viewer.toolbar.tool.pan.tooltip=Herramienta de Desplazamiento
viewer.toolbar.tool.text.label=
viewer.toolbar.tool.text.tooltip=Herramienta de Seleccion de Texto
viewer.toolbar.tool.select.label=
viewer.toolbar.tool.select.tooltip=Herramienta de Seleccion
viewer.toolbar.tool.link.label=
viewer.toolbar.tool.link.tooltip=Herramienta de Anotacion de Enlace
viewer.toolbar.tool.highlight.label=Resaltar
viewer.toolbar.tool.highlight.tooltip=Herramienta de Anotacion de Resaltado
viewer.toolbar.tool.strikeOut.label=Tachar
viewer.toolbar.tool.strikeOut.tooltip=Herramienta de Anotacion Tachar
viewer.toolbar.tool.underline.label=Subrayar
viewer.toolbar.tool.underline.tooltip=Herramienta de Anotacion Subrayado
viewer.toolbar.tool.line.label=Linea
viewer.toolbar.tool.line.tooltip=Herramienta de Anotacion de Linea
viewer.toolbar.tool.lineArrow.label=Flecha de Linea
viewer.toolbar.tool.lineArrow.tooltip=Herramienta de Anotacion Flecha de Linea
viewer.toolbar.tool.rectangle.label=Rectangulo
viewer.toolbar.tool.rectangle.tooltip=Herramienta de Anotacion Rectangulo
viewer.toolbar.tool.circle.label=Circulo
viewer.toolbar.tool.circle.tooltip=Herramienta de Anotacion Circulo
viewer.toolbar.tool.ink.label=Tinta
viewer.toolbar.tool.ink.tooltip=Herramienta de Anotacion de Tinta
viewer.toolbar.tool.freeText.label=Texto Libre
viewer.toolbar.tool.freeText.tooltip=Herramienta de Anotacion Texto Libre
viewer.toolbar.tool.textAnno.label=Anotacion de Texto
viewer.toolbar.tool.textAnno.tooltip=Herramienta de Anotacion de Texto
viewer.toolbar.tool.plolyLine.label=Polilinea
viewer.toolbar.tool.plolyLine.tooltip=Herramienta de Anotacion Polilinea
viewer.toolbar.tool.zoomIn.label=
viewer.toolbar.tool.zoomIn.tooltip=Herramienta de Acercar
viewer.toolbar.tool.zoomMarquis.label=
viewer.toolbar.tool.zoomMarquis.tooltip=Herramienta de Cuadro de Zoom
viewer.toolbar.tool.zoomDynamic.label=
viewer.toolbar.tool.zoomDynamic.tooltip=Herramienta de Zoom Dinamico
viewer.toolbar.tool.zoomOut.label=
viewer.toolbar.tool.zoomOut.tooltip=Herramienta de Alejar
viewer.toolbar.pageFit.fontEngine.label=
viewer.toolbar.pageFit.fontEngine.tooltip=Habilitar/Deshabilitar Motor de Fuente
viewer.toolbar.tool.forms.highlight.label=Resaltar Formularios
viewer.toolbar.tool.forms.highlight.tooltip=Mostrar/Ocultar Resaltado de Formularios
## Bottom Page View Control Toolbar
viewer.toolbar.pageView.nonContinuous.singlePage.label=
viewer.toolbar.pageView.nonContinuous.singlePage.tooltip=Vista de Pagina Individual No Continua
viewer.toolbar.pageView.nonContinuous.facingPage.label=
viewer.toolbar.pageView.nonContinuous.facingPage.tooltip=Vista de Pagina Adyacente No Continua
viewer.toolbar.pageView.continuous.singlePage.label=
viewer.toolbar.pageView.continuous.singlePage.tooltip=Vista de Pagina Individual Continua
viewer.toolbar.pageView.continuous.facingPage.label=
viewer.toolbar.pageView.continuous.facingPage.tooltip=Vista de Pagina Adyacente Continua
## File Menu and submenu items
viewer.menu.file.label=Archivo
viewer.menu.file.mnemonic=F
viewer.menu.open.label=Abrir
viewer.menu.open.file.label=Archivo...
viewer.menu.open.URL.label=URL...
viewer.menu.close.label=Cerrar
viewer.menu.saveAs.label=Guardar Como...
viewer.menu.exportText.label=Exportar Texto...
viewer.menu.exportSVG.label=Exportar SVG...
viewer.menu.documentPermission.label=Permisos del Documento...
viewer.menu.documentInformation.label=Informacion del Documento...
viewer.menu.documentFonts.label=Fuentes del Documento...
viewer.menu.printSetup.label=Configuracion de Impresion...
viewer.menu.print.label=Imprimir...
viewer.menu.exit.label=Salir
## View Menu and submenu items
viewer.menu.edit.label=Editar
viewer.menu.edit.mnemonic=E
viewer.menu.edit.undo.label=Deshacer
viewer.menu.edit.redo.label=Rehacer
viewer.menu.edit.copy.label=Copiar
viewer.menu.edit.delete.label=Eliminar
viewer.menu.edit.selectAll.label=Seleccionar Todo
viewer.menu.edit.deselectAll.label=Deseleccionar Todo
## View Menu and submenu items
viewer.menu.view.label=Ver
viewer.menu.view.mnemonic=V
viewer.menu.view.actualSize.label=Tamanio Real
viewer.menu.view.fitInWindow.label=Ajustar a la Ventana
viewer.menu.view.fitWidth.label=Ajustar al Ancho
viewer.menu.view.zoomIn.label=Acercar
viewer.menu.view.zoomOut.label=Alejar
viewer.menu.view.rotateLeft.label=Girar a la Izquierda
viewer.menu.view.rotateRight.label=Girar a la Derecha
viewer.menu.view.hideToolBar.label=Ocultar Barra de Herramientas
viewer.menu.view.showToolBar.label=Mostrar Barra de Herramientas
viewer.menu.view.showUtilityPane.label=Mostrar Panel de Utilidades
viewer.menu.view.hideUtilityPane.label=Ocultar Panel de Utilidades
## Document Menu and submenu items
viewer.menu.document.label=Documento
viewer.menu.document.mnemonic=D
viewer.menu.document.firstPage.label=Primera Pagina
viewer.menu.document.previousPage.label=Pagina Anterior
viewer.menu.document.nextPage.label=Pagina Siguiente
viewer.menu.document.lastPage.label=ultima Pagina
viewer.menu.document.search.label=Buscar...
viewer.menu.document.gotToPage.label=Ir a Pagina...
## Window Menu and submenu items
viewer.menu.window.label=Ventana
viewer.menu.window.mnemonic=W
viewer.menu.window.minAll.label=Minimizar Todo
viewer.menu.window.minAll.mnemonic=M
viewer.menu.window.frontAll.label=Traer Todo al Frente
viewer.menu.window.frontAll.mnemonic=B
viewer.menu.window.1.label=1
viewer.menu.window.1.mnemonic=1
viewer.menu.window.2.label=2
viewer.menu.window.2.mnemonic=2
viewer.menu.window.3.label=3
viewer.menu.window.3.mnemonic=3
viewer.menu.window.4.label=4
viewer.menu.window.4.mnemonic=4
viewer.menu.window.5.label=5
viewer.menu.window.5.mnemonic=5
viewer.menu.window.6.label=6
viewer.menu.window.6.mnemonic=6
viewer.menu.window.7.label=7
viewer.menu.window.7.mnemonic=7
viewer.menu.window.8.label=8
viewer.menu.window.8.mnemonic=8
viewer.menu.window.9.label=9
viewer.menu.window.9.mnemonic=9
## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic
## where X is an incrementing integer. The mnemonic should be one unique
## character found within the label
## Help Menu and submenu items
viewer.menu.help.label=Ayuda
viewer.menu.help.mnemonic=H
viewer.menu.help.about.label=Acerca del Visor ICEpdf...
## General error dialog
viewer.dialog.error.exception.title=ICEsoft ICEpdf - Excepcion
viewer.dialog.error.exception.msg=Se produjo un error al ejecutar tu comando debido a la siguiente excepcion\n{0}.
## Open File Dialog
viewer.dialog.openFile.title=Abrir Archivo
viewer.dialog.openFile.error.title=ICEsoft ICEpdf - Error al Abrir Archivo
viewer.dialog.openFile.error.msg=ICEpdf no pudo abrir el archivo especificado en {0}\nEl archivo puede estar corrupto o no ser de un tipo de archivo compatible..
viewer.dialog.openDocument.pdfException.title=ICEsoft ICEpdf - Excepcion PDF
viewer.dialog.openDocument.pdfException.msg=ICEpdf no pudo abrir el archivo especificado {0} \nEl archivo puede estar corrupto o no ser de un tipo de archivo compatible..
viewer.dialog.openDocument.pdfSecurityException.title=ICEsoft ICEpdf - Excepcion de Seguridad de PDF
viewer.dialog.openDocument.pdfSecurityException.msg=ICEpdf no pudo abrir el archivo encriptado en {0}\nEsto puede ser el resultado de una contrasenia invalida o de un proveedor de seguridad JCE faltante.\n\nPor favor, consulta la Guia del Desarrollador de ICEpdf para obtener mas informacion..
viewer.dialog.openDocument.exception.title=ICEsoft ICEpdf - Excepcion
viewer.dialog.openDocument.exception.msg=ICEpdf no pudo abrir el archivo especificado en {0}\nEl archivo puede estar corrupto o no ser de un tipo de archivo compatible..
viewer.dialog.openURL.exception.title=ICEsoft ICEpdf - Excepcion de URL
viewer.dialog.openURL.exception.msg=ICEpdf no pudo abrir el archivo especificado. {0} \nen URL: {1}
viewer.dialog.openURL.downloading.msg=Descargando {0}
## General error dialog
viewer.dialog.information.copyAll.title=ICEsoft ICEpdf - Informacion
viewer.dialog.information.copyAll.msg=El documento tiene mas de {0} paginas, por favor usa\n"Exportar texto..." para extraer el texto del documento.
## Open URL Dialog
viewer.dialog.security.title=Seguridad del Documento
viewer.dialog.security.msg=Este PDF esta protegido
viewer.dialog.security.password.label=Contrasenia:
viewer.dialog.security.okButton.label=Aceptar
viewer.dialog.security.okButton.mnemonic=O
viewer.dialog.security.cancelButton.label=Cancelar
viewer.dialog.security.cancelButton.mnemonic=C
## Open URL Dialog
viewer.dialog.openURL.title=Abrir URL
### Save a Copy Dialog
viewer.dialog.saveAs.title=Guardar Como
viewer.dialog.saveAs.extensionError.title=ICEsoft ICEpdf - Error al Guardar
viewer.dialog.saveAs.extensionError.msg=ICEpdf no pudo guardar en {0} porque no es un tipo de archivo compatible.
viewer.dialog.saveAs.noExtensionError.title=ICEsoft ICEpdf - Error al Guardar
viewer.dialog.saveAs.noExtensionError.msg=Por favor, especifica una extension de archivo.
viewer.dialog.saveAs.noneUniqueName.title=ICEsoft ICEpdf - Error al Guardar
viewer.dialog.saveAs.noneUniqueName.msg=El archivo llamado {0} ya existe. Por favor, especifica un nombre unico.
viewer.dialog.saveAs.noPermission.title=Visor ICEpdf RI - Error al Guardar
viewer.dialog.saveAs.noPermission.msg=No tienes permiso o credenciales para guardar este documento.
viewer.dialog.saveAs.noUpdates.title=Visor ICEpdf RI
viewer.dialog.saveAs.noUpdates.msg=Los cambios en el documento no se guardaran, por favor actualiza a ICEpdf PRO.
viewer.dialog.saveOnClose.noUpdates.title=Visor ICEpdf RI
viewer.dialog.saveOnClose.noUpdates.msg=¿Deseas guardar los cambios en {0}?
## Export Text Dialog
viewer.dialog.exportText.title=Exportar Texto del Documento
viewer.dialog.exportText.progress.msg=Extrayendo Texto del PDF
viewer.dialog.exportText.noExtensionError.title=ICEsoft ICEpdf - Error al Guardar
viewer.dialog.exportText.noExtensionError.msg=Por favor, especifica una extension de archivo.
# Text extraction output file
viewer.exportText.fileStamp.msg=Visor ICEsoft ICEpdf, (c) ICEsoft Technologies, Inc..
viewer.exportText.pageStamp.msg=<!----- Texto de Pagina {0} ---->
# Completed x out of y page(s).
viewer.exportText.fileStamp.progress.msg=Completado {0} de {1}.
viewer.exportText.fileStamp.progress.oneFile.msg={2} pagina
viewer.exportText.fileStamp.progress.moreFile.msg={2} paginas
## Export SVG Dialog
viewer.dialog.exportSVG.title=Exportar a SVG
viewer.dialog.exportSVG.status.exporting.msg=Exportando pagina {0} al archivo SVG {1} ...
viewer.dialog.exportSVG.status.error.msg=Problema al exportar la pagina {0} al archivo SVG {1} : {2}
viewer.dialog.exportSVG.status.finished.msg=Finalizada la exportacion de la pagina {0} al archivo SVG {1}
viewer.dialog.exportSVG.noExtensionError.title=ICEsoft ICEpdf - Error de SVG
viewer.dialog.exportSVG.noExtensionError.msg=Por favor, especifica una extension de archivo.
viewer.dialog.exportSVG.exportError.title=ICEsoft ICEpdf - Error de SVG
viewer.dialog.exportSVG.exportError.msg=ICEpdf no pudo exportar a {0} \n... porque no es un tipo de archivo compatible o \n... porque el archivo ha sido corrompido..
# Printing Progress bar
viewer.dialog.printing.status.progress.msg=Pagina {0} de {1}
viewer.dialog.printing.status.start.msg=Enviando Pagina(s) a la Impresora
## Document Permissions Dialog
viewer.dialog.documentPermissions.title=Permisos del Documento
viewer.dialog.documentPermissions.securityMethod.label=Metodo de Seguridad:
viewer.dialog.documentPermissions.userPassword.label=Contrasenia del Usuario:
viewer.dialog.documentPermissions.ownerPassword.label=Contrasenia del Propietario:
viewer.dialog.documentPermissions.printing.label=Impresion:
viewer.dialog.documentPermissions.changing.label=Cambiar el Documento:
viewer.dialog.documentPermissions.copyExtraction.label=Copiar o Extraer Contenido:
viewer.dialog.documentPermissions.comments.label=Crear Comentarios y Campos de Formularios:
viewer.dialog.documentPermissions.formFillingIn.label=Rellenar Campos de Formularios o Firmar:
viewer.dialog.documentPermissions.accessibility.label=Accesibilidad de Contenido Habilitada:
viewer.dialog.documentPermissions.assembly.label=Ensamblaje de Documentos:
viewer.dialog.documentPermissions.encryptionLevel.label=Nivel de Encriptacion:
viewer.dialog.documentPermissions.securityLevel={0}-bits v{1} R {2}
viewer.dialog.documentPermissions.none=Ninguno
viewer.dialog.documentPermissions.no=No
viewer.dialog.documentPermissions.yes=Si
viewer.dialog.documentPermissions.allowed=Permitido
viewer.dialog.documentPermissions.notAllowed=No Permitido
viewer.dialog.documentPermissions.fullyAllowed=Totalmente Permitido
viewer.dialog.documentPermissions.standardSecurity=Seguridad Estandar de Adobe Acrobat
viewer.dialog.documentPermissions.partial=Parcial (Baja Calidad)
## Document Information Dialog
viewer.dialog.documentInformation.title=Informacion del Documento
viewer.dialog.documentInformation.title.label=Titulo:
viewer.dialog.documentInformation.subject.label=Tema:
viewer.dialog.documentInformation.author.label=Autor:
viewer.dialog.documentInformation.keywords.label=Palabras Clave:
viewer.dialog.documentInformation.creator.label=Creador:
viewer.dialog.documentInformation.producer.label=Productor:
viewer.dialog.documentInformation.created.label=Creado:
viewer.dialog.documentInformation.modified.label=Modificado:
viewer.dialog.documentInformation.notAvailable=No Disponible
## Go to Page Dialog
viewer.dialog.goToPage.title=Ir a Pagina...
viewer.dialog.goToPage.description.label=Numero de Pagina
## About Dialog
viewer.dialog.about.title=Acerca del Visor ICEpdf
viewer.dialog.about.pageNumber.label=\n\nConsulta el sitio web de ICEpdf para las ultimas noticias:\nhttp://www.icepdf.org/ \n\n
## Font Properties Dialog
viewer.dialog.fonts.title=Propiedades de Fuente del Documento
viewer.dialog.fonts.border.label=Fuentes utilizadas en este documento
viewer.dialog.fonts.info.type.label=Tipo: {0}
viewer.dialog.fonts.info.encoding.label=Codificacion: {0}
viewer.dialog.fonts.info.substitution.type.label=Tipo Real: {0}
viewer.dialog.fonts.info.substitution.path.label=Ruta: {0}
viewer.dialog.fonts.searching.label=Recopilando datos de fuentes ({0}%).
viewer.dialog.fonts.resetCache.label=Restablecer Cache
viewer.dialog.fonts.resetCache.tip=Restablecer el archivo de cache de propiedades de fuentes y escanear el sistema en busca de fuentes nuevas.
## Utility Pane Bookmarks Tab
viewer.utilityPane.bookmarks.tab.title=Marcadores
## Utility Pane Bookmarks Tab
viewer.utilityPane.attachments.tab.title=Adjuntos
viewer.utilityPane.attachments.column.fileName.title=Nombre
viewer.utilityPane.attachments.column.description.title=Descripcion
viewer.utilityPane.attachments.column.modified.title=Modificado
viewer.utilityPane.attachments.column.size.title=Tamanio
viewer.utilityPane.attachments.column.compressedSize.title=Tamanio comprimido
viewer.utilityPane.attachments.menu.saveAs.label=Guardar Como...
viewer.utilityPane.attachments.saveAs.replace.title=Visor ICEsoft ICEpdf - Error al Guardar
viewer.utilityPane.attachments.saveAs.replace.msg=El archivo llamado {0} ya existe. ¿Quieres reemplazarlo?
## Utility Pane Thumbnails
viewer.utilityPane.thumbs.tab.title=Miniaturas
## Layers Pane
viewer.utilityPane.layers.tab.title=Capas
## Signature Pane
viewer.utilityPane.signatures.tab.title=Firmas
viewer.utilityPane.signatures.tab.certTree.error.label=Campos de Firma no Firmados. No se pudo validar el certificado del firmante {0} {1}.
viewer.utilityPane.signatures.tab.certTree.rootSigned.label=Firmado por {0} {1}.
viewer.utilityPane.signatures.tab.certTree.rootValidating.label=Validando firma {0} {1}.
viewer.utilityPane.signatures.tab.certTree.cert.invalid.label=La firma no es valida:
viewer.utilityPane.signatures.tab.certTree.cert.unknown.label=La firma es valida:
viewer.utilityPane.signatures.tab.certTree.cert.valid.label=La validez de la firma es desconocida:
viewer.utilityPane.signatures.tab.certTree.doc.modified.label=Esta version del documento esta sin cambios, pero se han realizado cambios posteriores.
viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label=El documento no ha sido modificado desde que fue firmado.
viewer.utilityPane.signatures.tab.certTree.doc.major.label=El documento ha sido modificado o corrompido desde que fue firmado.
viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label=La identidad del firmante es desconocida porque no se pudo encontrar en tu almacen de claves.
viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label=La firma es valida, pero no se pudo verificar la revocacion de la identidad del firmante.
viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label=La identidad del firmante es valida.
viewer.utilityPane.signatures.tab.certTree.signature.time.local.label=La hora de firma proviene del reloj de la computadora de este firmante.
viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label=La firma incluia un sello de tiempo incrustado, pero no se pudo validar.
viewer.utilityPane.signatures.tab.certTree.signature.details.label=Detalles de la Firma
viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label=Motivo: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.location.label=Ubicacion: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.full.label=Detalles del Certificado...
viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label=ultima Verificacion: {0}
viewer.utilityPane.signatures.tab.certTree.unsigned.label=Campos de Firma no Firmados.
## Signature certificate view dialog.
viewer.utilityPane.signatures.cert.dialog.title=Detalles del Certificado
viewer.utilityPane.signatures.cert.dialog.closeButton.label=Cerrar
viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic=C
viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label=N/A
viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label=Asunto N/A
viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label=Emisor N/A
viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label={0} - {1}
viewer.utilityPane.signatures.cert.dialog.info.column1.label=Campo
viewer.utilityPane.signatures.cert.dialog.info.column2.label=Valor
viewer.utilityPane.signatures.cert.dialog.info.version.label=Version
viewer.utilityPane.signatures.cert.dialog.info.version.value=v{0}
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label=Numero de Serie
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value={0}
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label=Algoritmo de Firma
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value={0}
viewer.utilityPane.signatures.cert.dialog.info.issuer.label=Emisor
viewer.utilityPane.signatures.cert.dialog.info.issuer.value=Organizacion: {0} \nUnidad de Organizacion: {1} \nNombre Comun: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.validity.label=Validez
viewer.utilityPane.signatures.cert.dialog.info.validity.value=Desde: {0}\n Para: {1}
viewer.utilityPane.signatures.cert.dialog.info.subject.label=Asunto
viewer.utilityPane.signatures.cert.dialog.info.subject.value=Organizacion: {0} \nUnidad de Organizacion: {1} \nNombre Comun: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.signature.label=Firma
viewer.utilityPane.signatures.cert.dialog.info.md5.label=Huella Digital MD5
viewer.utilityPane.signatures.cert.dialog.info.md5.value={0}
viewer.utilityPane.signatures.cert.dialog.info.sha1.label=Huella Digital SHA1
viewer.utilityPane.signatures.cert.dialog.info.sha1.value={0}
viewer.utilityPane.signatures.verify.initializingMessage.label=Validando {0} de {1} Firmas
viewer.utilityPane.signatures.verify.completeMessage.label=Proceso de validacion completo
viewer.utilityPane.signatures.verify.validating.label=Validando firma...
## Annotation Tab
viewer.utilityPane.annotation.tab.title=Anotaciones
## Utility Pane Annotation Link Tab
viewer.utilityPane.annotation.link.appearance.title=Anotacion de Enlace
viewer.utilityPane.annotation.link.highlightType=Estilo de Resaltado:
viewer.utilityPane.annotation.link.none=Ninguno
viewer.utilityPane.annotation.link.invert=Invertir`
viewer.utilityPane.annotation.link.outline=Contorno
viewer.utilityPane.annotation.link.push=Empujar
## Utility Pane Annotation text markup Tab
viewer.utilityPane.annotation.textMarkup.appearance.title=Anotacion de Marcado de Texto
viewer.utilityPane.annotation.textMarkup.highlightType=Tipo:
viewer.utilityPane.annotation.textMarkup.colorChooserTitle=Color de Marcado
viewer.utilityPane.annotation.textMarkup.colorLabel=Color:
viewer.utilityPane.annotation.textMarkup.transparencyLabel=Transparencia:
## Utility Pane Annotation line Tab
viewer.utilityPane.annotation.line.appearance.title=Anotacion de Linea
viewer.utilityPane.annotation.line.lineThickness=Grosor de Linea:
viewer.utilityPane.annotation.line.lineStyle=Estilo de Linea:
viewer.utilityPane.annotation.line.startStyle=Inicio:
viewer.utilityPane.annotation.line.endStyle=Fin:
viewer.utilityPane.annotation.line.colorChooserTitle=Color de Linea
viewer.utilityPane.annotation.line.colorInternalChooserTitle=Color Interno de Linea
viewer.utilityPane.annotation.line.colorLabel=Color:
viewer.utilityPane.annotation.line.colorInternalLabel=Color de Relleno:
viewer.utilityPane.annotation.line.end.none=Ninguno
viewer.utilityPane.annotation.line.end.openArrow=Flecha Abierta
viewer.utilityPane.annotation.line.end.closedArrow=Flecha Cerrada
viewer.utilityPane.annotation.line.end.diamond=Diamante
viewer.utilityPane.annotation.line.end.square=Cuadrado
viewer.utilityPane.annotation.line.end.circle=Circulo
viewer.utilityPane.annotation.line.transparencyLabel=Transparencia:
## Utility Pane Annotation square Tab
viewer.utilityPane.annotation.square.appearance.title=Anotacion de Cuadrado
viewer.utilityPane.annotation.square.lineThickness=Grosor de Borde:
viewer.utilityPane.annotation.square.lineStyle=Estilo de Borde:
viewer.utilityPane.annotation.square.colorBorderChooserTitle=Color de Borde
viewer.utilityPane.annotation.square.colorInteriorChooserTitle=Color de Relleno
viewer.utilityPane.annotation.square.borderTypeLabel=Tipo de Borde:
viewer.utilityPane.annotation.square.colorBorderLabel=Color de Borde:
viewer.utilityPane.annotation.square.colorInteriorLabel=Color de Relleno:
viewer.utilityPane.annotation.square.fillTypeLabel=Tipo de Relleno:
viewer.utilityPane.annotation.square.transparencyLabel=Transparencia:
## Utility Pane Annotation free text Tab
viewer.utilityPane.annotation.freeText.appearance.title=Anotacion de Texto Libre
viewer.utilityPane.annotation.freeText.font.name=Nombre de Fuente:
viewer.utilityPane.annotation.freeText.font.style=Estilo de Fuente:
viewer.utilityPane.annotation.freeText.font.size=Tamanio de Fuente:
viewer.utilityPane.annotation.freeText.font.color=Color de Fuente:
viewer.utilityPane.annotation.freeText.font.color.ChooserTitle=Color de Fuente
viewer.utilityPane.annotation.freeText.border.thickness=Grosor de Borde:
viewer.utilityPane.annotation.freeText.border.type=Tipo de Borde:
viewer.utilityPane.annotation.freeText.border.style=Estilo de Borde:
viewer.utilityPane.annotation.freeText.border.color=Color de Borde:
viewer.utilityPane.annotation.freeText.border.color.ChooserTitle=Color de Borde
viewer.utilityPane.annotation.freeText.fill.type=Tipo de Relleno:
viewer.utilityPane.annotation.freeText.fill.color=Color de Relleno:
viewer.utilityPane.annotation.freeText.transparencyLabel=Transparencia:
viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle=Color de Relleno
viewer.utilityPane.annotation.freeText.font.dialog=Dialogo
viewer.utilityPane.annotation.freeText.font.dialogInput=Entrada de Dialogo
viewer.utilityPane.annotation.freeText.font.monospaced=Espaciado Monoespaciado
viewer.utilityPane.annotation.freeText.font.serif=Serif
viewer.utilityPane.annotation.freeText.font.sanSerif=SansSerif
viewer.utilityPane.annotation.freeText.font.style.plain=Plain
viewer.utilityPane.annotation.freeText.font.style.italic=Italic
viewer.utilityPane.annotation.freeText.font.style.bold=Bold
viewer.utilityPane.annotation.freeText.font.name.helvetica=Helvetica
viewer.utilityPane.annotation.freeText.font.name.helveticaOblique=Helvetica-Oblique
viewer.utilityPane.annotation.freeText.font.name.helveticaBold=Helvetica-Bold
viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique=Helvetica-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.timesItalic=Times-Italic
viewer.utilityPane.annotation.freeText.font.name.timesBold=Times-Bold
viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic=Times-BoldItalic
viewer.utilityPane.annotation.freeText.font.name.timesRoman=Times-Roman
viewer.utilityPane.annotation.freeText.font.name.courier=Courier
viewer.utilityPane.annotation.freeText.font.name.courierOblique=Courier-Oblique
viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique=Courier-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.courierBold=Courier-Bold
## Utility Pane Annotation text Tab
viewer.utilityPane.annotation.text.appearance.title=Anotacion de Texto
viewer.utilityPane.annotation.text.iconName=Icono:
viewer.utilityPane.annotation.text.iconName.comment=Comentario
viewer.utilityPane.annotation.text.iconName.check=Marca de Verificacion
viewer.utilityPane.annotation.text.iconName.checkMark=Marca de Verificacion
viewer.utilityPane.annotation.text.iconName.circle=Circulo
viewer.utilityPane.annotation.text.iconName.cross=Cruz
viewer.utilityPane.annotation.text.iconName.crossHairs=Cruz de Mira
viewer.utilityPane.annotation.text.iconName.help=Ayuda
viewer.utilityPane.annotation.text.iconName.insert=Insertar
viewer.utilityPane.annotation.text.iconName.key=Clave
viewer.utilityPane.annotation.text.iconName.newParagraph=Nuevo Parrafo
viewer.utilityPane.annotation.text.iconName.paragraph=Parrafo
viewer.utilityPane.annotation.text.iconName.rightArrow=Flecha Derecha
viewer.utilityPane.annotation.text.iconName.rightPointer=Puntero Derecho
viewer.utilityPane.annotation.text.iconName.star=Estrella
viewer.utilityPane.annotation.text.iconName.upArrow=Flecha hacia Arriba
viewer.utilityPane.annotation.text.iconName.upLeftArrow=Flecha hacia Arriba y a la Izquierda
## Utility Pane Annotation circle Tab
viewer.utilityPane.annotation.circle.appearance.title=Anotacion de Circulo
viewer.utilityPane.annotation.circle.lineThickness=Grosor de Borde:
viewer.utilityPane.annotation.circle.lineStyle=Estilo de Borde:
viewer.utilityPane.annotation.circle.colorBorderChooserTitle=Color de Borde
viewer.utilityPane.annotation.circle.colorInteriorChooserTitle=Color Interior
viewer.utilityPane.annotation.circle.colorBorderLabel=Color de Borde:
viewer.utilityPane.annotation.circle.colorInteriorLabel=Color de Relleno:
viewer.utilityPane.annotation.circle.fillTypeLabel=Tipo de Relleno:
viewer.utilityPane.annotation.circle.transparencyLabel=Transparencia:
## Utility Pane Annotation ink Tab
viewer.utilityPane.annotation.ink.appearance.title=Anotacion de Tinta
viewer.utilityPane.annotation.ink.lineThickness=Grosor de Tinta:
viewer.utilityPane.annotation.ink.lineStyle=Estilo de Tinta:
viewer.utilityPane.annotation.ink.colorBorderChooserTitle=Color de Tinta
viewer.utilityPane.annotation.ink.colorBorderLabel=Color de Tinta:
viewer.utilityPane.annotation.ink.transparencyLabel=Transparencia:
## Utility Pane border Tab
viewer.utilityPane.annotation.border.title=Borde
viewer.utilityPane.annotation.border.linkType=Tipo de Borde:
viewer.utilityPane.annotation.border.lineThickness=Grosor de Borde:
viewer.utilityPane.annotation.border.lineStyle=Estilo de Borde:
viewer.utilityPane.annotation.border.colorChooserTitle=Color de Borde
viewer.utilityPane.annotation.border.colorLabel=Color:
viewer.utilityPane.annotation.border.borderType.visibleRectangle=Visible
viewer.utilityPane.annotation.border.borderType.invisibleRectangle=Invisible
viewer.utilityPane.annotation.border.solid=Solido
viewer.utilityPane.annotation.border.dashed=Discontinuo
viewer.utilityPane.annotation.border.beveled=Biselado
viewer.utilityPane.annotation.border.inset=Hundido
viewer.utilityPane.annotation.border.underline=Subrayado
## Utility Pane border Tab
viewer.utilityPane.annotation.flags.title=Banderas
viewer.utilityPane.annotation.flags.noRotate=Sin Girar:
viewer.utilityPane.annotation.flags.noZoom=Sin Zoom:
viewer.utilityPane.annotation.flags.readOnly=Solo Lectura:
viewer.utilityPane.annotation.flags.printable=Imprimible:
viewer.utilityPane.annotation.flags.yes=Imprimible:
viewer.utilityPane.annotation.flags.enabled=Habilitado
viewer.utilityPane.annotation.flags.disabled=Deshabilitado
## annotation action pane and dialogs.
viewer.utilityPane.action.selectionTitle=Accion
viewer.utilityPane.action.addAction=Agregar
viewer.utilityPane.action.editAction=Editar
viewer.utilityPane.action.removeAction=Eliminar
viewer.utilityPane.action.type.destination.label=Destino
viewer.utilityPane.action.type.uriAction.label=Accion de URI
viewer.utilityPane.action.type.goToAction.label=Accion Ir A
viewer.utilityPane.action.type.launchAction.label=Accion de Lanzamiento
viewer.utilityPane.action.dialog.new.title=Agregar Nueva Accion
viewer.utilityPane.action.dialog.new.msgs=Tipo de Accion:
viewer.utilityPane.action.dialog.delete.title=Confirmacion de Eliminacion
viewer.utilityPane.action.dialog.delete.msgs=¿Estas seguro de que deseas eliminar esta accion?
## uri action dialog test
viewer.utilityPane.action.dialog.uri.title=Propiedades de Accion de URI
viewer.utilityPane.action.dialog.uri.msgs=URI:
## launch action dialog test
viewer.utilityPane.action.dialog.launch.title=Propiedades de Accion de Lanzamiento
viewer.utilityPane.action.dialog.launch.msgs=Ruta de Archivo:
## GoTo action dialog text
viewer.utilityPane.action.dialog.goto.title=Propiedades de Accion Ir A
viewer.utilityPane.action.dialog.goto.page.label=Pagina:
viewer.utilityPane.action.dialog.goto.type.label=Tipo
viewer.utilityPane.action.dialog.goto.type.xyz.label=Absoluto
viewer.utilityPane.action.dialog.goto.type.fit.label=Ajustar a la Pagina
viewer.utilityPane.action.dialog.goto.type.fith.label=Ajustar Ancho Superior
viewer.utilityPane.action.dialog.goto.type.fitv.label=Ajustar Ancho Izquierdo
viewer.utilityPane.action.dialog.goto.type.fitr.label=Ajustar Cuadro de Zoom
viewer.utilityPane.action.dialog.goto.type.fitb.label=Ajustar Limites de Pagina
viewer.utilityPane.action.dialog.goto.type.fitbh.label=Ajustar Limites Superior
viewer.utilityPane.action.dialog.goto.type.fitbv.label=Ajustar Limites Izquierdo
viewer.utilityPane.action.dialog.goto.right.label=Derecha:
viewer.utilityPane.action.dialog.goto.left.label=Izquierda:
viewer.utilityPane.action.dialog.goto.top.label=Superior:
viewer.utilityPane.action.dialog.goto.bottom.label=Inferior:
viewer.utilityPane.action.dialog.goto.zoom.label=Zoom:
viewer.utilityPane.action.dialog.goto.unassigned.label=NaN
viewer.utilityPane.action.dialog.goto.current.label=Vista Actual:
viewer.utilityPane.action.dialog.goto.current=Establecer Ubicacion
viewer.utilityPane.action.dialog.goto.name.label=Nombre:
viewer.utilityPane.action.dialog.goto.browse=Examinar...
viewer.utilityPane.action.dialog.goto.explicitDestination.title=Destino Implicito
viewer.utilityPane.action.dialog.goto.nameDestination.title=Destino Nombrado
# Destination Named Tree
viewer.utilityPane.action.dialog.goto.nameTree.title=arbol de Nombres del Documento
viewer.utilityPane.action.dialog.goto.nameTree.root.label=arbol de Nombres
viewer.utilityPane.action.dialog.goto.nameTree.branch.label={0} a {1}
## Utility Pane Search Tab
viewer.utilityPane.search.tab.title=Buscar
viewer.utilityPane.search.searchText.label=Buscar Texto:
viewer.utilityPane.search.results.label=Resultados:
viewer.utilityPane.search.searchButton.label=Buscar
viewer.utilityPane.search.clearSearchButton.label=Limpiar
viewer.utilityPane.search.caseSenstiveCheckbox.label=Distinguir mayusculas y minusculas
viewer.utilityPane.search.wholeWordCheckbox.label=Solo palabras completas
viewer.utilityPane.search.cumlitiveCheckbox.label=Acumulativo
viewer.utilityPane.search.showPagesCheckbox.label=Mostrar Paginas
viewer.utilityPane.search.stopButton.label=Detener
viewer.utilityPane.search.searching.msg=Buscar...
# Searching x out of y page(s)
viewer.utilityPane.search.searching1.msg=Buscando {0} de {1}
viewer.utilityPane.search.searching1.oneFile.msg={2} pagina
viewer.utilityPane.search.searching1.moreFile.msg={2} paginas
# Page x (y result(s))
viewer.utilityPane.search.result.msg=Pagina {0} ({1})
viewer.utilityPane.search.result.oneFile.msg={2} resultado
viewer.utilityPane.search.result.moreFile.msg={2} resultados
# Searched x page(s) (y matches)
viewer.utilityPane.search.progress.msg=Buscado {0} {1} ({2})
viewer.utilityPane.search.progress.onePage.msg=pagina
viewer.utilityPane.search.progress.morePage.msg=paginas
viewer.utilityPane.search.progress.oneMatch.msg={2} coincidencia
viewer.utilityPane.search.progress.moreMatch.msg={2} coincidencias
## Popup Annotation component
viewer.annotation.popup.reply.label=Responder
viewer.annotation.popup.delete.label=Eliminar
viewer.annotation.popup.status.label=Establecer Estado
viewer.annotation.popup.status.accepted.label=Aceptado
viewer.annotation.popup.status.cancelled.label=Cancelado
viewer.annotation.popup.status.completed.label=Completado
viewer.annotation.popup.status.rejected.label=Rechazado
viewer.annotation.popup.status.none.label=Ninguno
viewer.annotation.popup.openAll.label=Abrir todas las Ventanas Emergentes
viewer.annotation.popup.minimizeAll.label=Minimizar Ventanas Emergentes
viewer.annotation.popup.replyTo.label=Re: {0}
viewer.annotation.popup.status.none.title=Ninguno: {0}
viewer.annotation.popup.status.none.msg=Ninguno establecido por {0}
viewer.annotation.popup.status.accepted.title=Aceptado: {0}
viewer.annotation.popup.status.accepted.msg=Aceptado establecido por {0}
viewer.annotation.popup.status.cancelled.title=Cancelado: {0}
viewer.annotation.popup.status.cancelled.msg=Cancelado establecido por {0}
viewer.annotation.popup.status.completed.title=Completado: {0}
viewer.annotation.popup.status.completed.msg=Completado establecido por {0}
viewer.annotation.popup.status.rejected.title=Rechazado: {0}
viewer.annotation.popup.status.rejected.msg=Rechazado establecido por {0}
## Signature component
viewer.annotation.signature.menu.validateSignature.label=Validar Firma
viewer.annotation.signature.menu.showCertificates.label=Mostrar Propiedades del Certificado
viewer.annotation.signature.menu.signatureProperties.label=Mostrar Propiedades de la Firma
viewer.annotation.signature.menu.signaturePageNavigation.label=Ir a Pagina...
## Signature validation dialog.
viewer.annotation.signature.validation.dialog.title=Resumen de Validacion de Firmas
viewer.annotation.signature.validation.dialog.close.button.label=Cerrar
viewer.annotation.signature.validation.dialog.signerProperties.button.label=Propiedades de la Firma...
# common validation messages
viewer.annotation.signature.validation.common.invalid.label=La firma no es valida:
viewer.annotation.signature.validation.common.unknown.label=La firma es valida:
viewer.annotation.signature.validation.common.valid.label=La validez de la firma es desconocida:
viewer.annotation.signature.validation.common.signedBy.label=- Firmado por {0} {1}
viewer.annotation.signature.validation.common.doc.modified.label=- Esta version del documento esta sin cambios, pero se han realizado cambios posteriores.
viewer.annotation.signature.validation.common.doc.unmodified.label=- El documento no ha sido modificado desde que fue firmado.
viewer.annotation.signature.validation.common.doc.major.label=- El documento ha sido modificado o corrompido desde que fue firmado.
viewer.annotation.signature.validation.common.identity.unknown.label=- La identidad del firmante es desconocida porque no se pudo encontrar en tu almacen de claves.
viewer.annotation.signature.validation.common.identity.unchecked.label=- La firma es valida, pero no se pudo verificar la revocacion de la identidad del firmante.
viewer.annotation.signature.validation.common.identity.valid.label=- La identidad del firmante es valida.
viewer.annotation.signature.validation.common.time.local.label=- La hora de firma proviene del reloj de la computadora de este firmante.
viewer.annotation.signature.validation.common.time.embedded.label=- La firma incluia un sello de tiempo incrustado, pero no se pudo validar.
viewer.annotation.signature.validation.common.notAvailable.label=N/A
## Signatures properties Dialog.
viewer.annotation.signature.properties.dialog.title=Propiedades de la Firma
viewer.annotation.signature.properties.dialog.invalid.label=La firma no es valida
viewer.annotation.signature.properties.dialog.unknown.label=La firma es valida
viewer.annotation.signature.properties.dialog.valid.label=La validez de la firma es desconocida
viewer.annotation.signature.properties.dialog.signedBy.label=Firmado por {0} {1}
viewer.annotation.signature.properties.dialog.signingTime.label=Firmado a las: {0}
viewer.annotation.signature.properties.dialog.reason.label=Motivo: {0}
viewer.annotation.signature.properties.dialog.location.label=Ubicacion: {0}
# SignatureSigner Info
viewer.annotation.signature.properties.dialog.pathValidation.success=- Las comprobaciones de validacion de ruta fueron exitosas.
viewer.annotation.signature.properties.dialog.pathValidation.failure=- Las comprobaciones de validacion de ruta no fueron exitosas.
viewer.annotation.signature.properties.dialog.revocation.success=- El certificado del firmante es valido y no ha sido revocado..
viewer.annotation.signature.properties.dialog.revocation.failure=- La verificacion de revocacion no se realizo..
viewer.annotation.signature.properties.dialog.certificateExpired.failure=- El certificado del firmante ha expirado..
viewer.annotation.signature.properties.dialog.showCertificates.label=Certificado del Firmante...
viewer.annotation.signature.properties.dialog.validity.title=Resumen de Validez
viewer.annotation.signature.properties.dialog.signerInfo.title=Informacion del Firmante
## Common Button Labels
viewer.button.ok.label=Aceptar
viewer.button.ok.mnemonic=O
viewer.button.cancel.label=Cancelar
viewer.button.cancel.mnemonic=C
## Pilot Specific Mesages
pilot.title=ICEbrowser - Error de Piloto ICEpdf
pilot.loading.msg=Abriendo el documento {0} ...
pilot.display.msg=Mostrando {0}
pilot.loading.error.msg=Piloto PDF: No se pudo cargar {0}.
pilot.error.classLoading=Clase requerida {0} no encontrada. La biblioteca requerida 'icepdf.jar' puede que no este en la ruta de clases - Piloto PDF deshabilitado.";
###
# General Error Messages
# Command Line Errors
viewer.commandLin.error=Usage: java org.icepdf.ri.viewer.Main [-loadfile <value>] [-loadurl <value>]
# Launcher errors
viewer.launcher.URLError.dialog.title=ICEsoft ICEpdf
viewer.launcher.URLError.dialog.message=ICEpdf no pudo abrir el archivo especificado. {0} en URL: {1}.
viewer.launcher.lookAndFeel.error.message=El aspecto y comportamiento especificado ({0}) no es accesible desde esta plataforma.
# Pilot Loading Errors
### parser error dialogs
parse.title=Error al Analizar Propiedades
parse.integer=Advertencia: {0} no es un numero entero correcto.
parse.float=Advertencia: {0} no es un numero flotante correcto.
parse.double=Advertencia: {0} no es un numero doble correcto.
parse.choice=Advertencia: {0} no es una opcion valida.
parse.laf=Advertencia: el aspecto y comportamiento {0} no es compatible.
### Properties Manager Errors
manager.properties.title=Administrador de Propiedades de ICEpdf
fontManager.properties.title=Administrador de Fuentes de ICEpdf
manager.properties.createNewDirectory=Para crear el directorio {0},\nDonde el Visor ICEpdf almacenara los cambios en su configuracion, haz clic en Si.\n\nSi haces clic en "No", todos los cambios que realices en la configuracion del Visor ICEpdf se perderan cuando salgas de la aplicacion.\nSe perderan al cerrar la aplicacion. \n\n
manager.properties.failedCreation=No se puede crear el directorio del visor ICEpdf para almacenar los datos del usuario:\n{0}\nEl Visor ICEpdf no guardara los cambios en su configuracion predeterminada.
manager.properties.session.nolock=Error al crear el archivo de bloqueo:\n{0}\n
manager.properties.session.readError=Error al cargar el archivo de propiedades: \n{0}
manager.properties.deleted=El archivo de propiedades ha sido eliminado\n({0})\nRecreate it ?
manager.properties.modified=El archivo de propiedades ha sido modificado desde la ultima actualizacion\n({0,date,long})\n¿Te gustaria fusionar los cambios en el archivo con las propiedades actuales?
manager.properties.saveError=No se puede guardar el archivo de propiedades.\nEncountered the folowing error :\n{0}
manager.properties.lafError=El aspecto y comportamiento {0} proporcionado en las propiedades predeterminadas no es compatible.\nUsando la configuracion predeterminada del sistema.
manager.properties.brokenProperty=Propiedad predeterminada daniada {0} value: {1}
manager.properties.missingProperty=Falta el valor de la propiedad predeterminada {0}: {1}

View File

@ -0,0 +1,12 @@
AnalysisResultsContentPanel_aggregateScore_displayKey=Puntuación Agregada
AnalysisResultsContentPanel_content_displayKey=Articulo
# {0} - analysisResultsNumber
AnalysisResultsContentPanel_result_headerKey=Resultado del Analisis {0}
AnalysisResultsContentViewer_setNode_errorMessage=Hubo un error cargando los resultados.
AnalysisResultsContentViewer_setNode_loadingMessage=Cargando...
AnalysisResultsContentViewer_title=Resultados del Analisis
AnalysisResultsContentViewer_tooltip=Visualizador para Resultados del Analisis relacionados con el nodo seleccionado.
AnalysisResultsViewModel_displayAttributes_conclusion=Conclusion
AnalysisResultsViewModel_displayAttributes_configuration=Configuracion
AnalysisResultsViewModel_displayAttributes_score=Puntuacion
AnalysisResultsViewModel_displayAttributes_type=Tipo

View File

@ -0,0 +1,22 @@
AnnotationsContentViewer.onEmpty=No encontramos anotaciones para este item en particular.
AnnotationsContentViewer.title=Anotaciones
AnnotationsContentViewer.toolTip=Muestra etiquetas y comentarios asociados con el contenido seleccionado.
AnnotationUtils.centralRepositoryEntry.title=Comentarios del Repositorio Central
AnnotationUtils.centralRepositoryEntryDataLabel.case=Caso:
AnnotationUtils.centralRepositoryEntryDataLabel.comment=Comentario:
AnnotationUtils.centralRepositoryEntryDataLabel.path=Ruta:
AnnotationUtils.centralRepositoryEntryDataLabel.type=Tipo:
AnnotationUtils.fileHitEntry.artifactCommentTitle=Comentario de Artefacto
AnnotationUtils.fileHitEntry.comment=Comentario:
AnnotationUtils.fileHitEntry.hashSetHitTitle=Comentarios de Conjuntos de Hash Hit
AnnotationUtils.fileHitEntry.interestingFileHitTitle=Comentarios de Archivos Interesantes Encontrados
AnnotationUtils.fileHitEntry.interestingItemTitle=Comentarios de Elementos Interesantes
AnnotationUtils.fileHitEntry.setName=Nombre del Conjunto:
AnnotationUtils.onEmpty=No encontramos anotaciones para este item en particular.
AnnotationUtils.sourceFile.title=Archivo Fuente
AnnotationUtils.tagEntry.title=Etiquetas
AnnotationUtils.tagEntryDataLabel.comment=Comentario:
AnnotationUtils.tagEntryDataLabel.tag=Etiqueta:
AnnotationUtils.tagEntryDataLabel.tagUser=Examinador:
AnnotationUtils.title=Anotaciones
AnnotationUtils.toolTip=Muestra etiquetas y comentarios asociados con el contenido seleccionado.

View File

@ -0,0 +1,120 @@
CalllogArtifactViewer_cr_disabled_message=Habilitar Repositorio Central para ver, crear y editar personas.
CallLogArtifactViewer_heading_metadata=Metadatos
CallLogArtifactViewer_heading_others=Otros Atributos
CallLogArtifactViewer_heading_parties=Partes
CallLogArtifactViewer_heading_Source=Fuente
CallLogArtifactViewer_label_datasource=Fuente de Datos
CallLogArtifactViewer_label_date=Fecha
CallLogArtifactViewer_label_direction=Direccion
CallLogArtifactViewer_label_duration=Duracion
CallLogArtifactViewer_label_from=Desde
CallLogArtifactViewer_label_hostName=Anfitrion
CallLogArtifactViewer_label_to=Para
CallLogArtifactViewer_suffix_local=(Local)
CallLogArtifactViewer_value_unknown=Desconocido
# {0} - contact name
CommunicationArtifactViewerHelper_contact_label=Contacto: {0}
CommunicationArtifactViewerHelper_contact_label_unknown=Desconocido
CommunicationArtifactViewerHelper_menuitem_copy=Copiar
CommunicationArtifactViewerHelper_persona_button_create=Crear
CommunicationArtifactViewerHelper_persona_button_view=Ver
CommunicationArtifactViewerHelper_persona_label=Persona:
CommunicationArtifactViewerHelper_persona_searching=Busqueda...
CommunicationArtifactViewerHelper_persona_unknown=Desconocido
ContactArtifactViewer.contactImage.text=
ContactArtifactViewer_contactname_unknown=Desconocido
ContactArtifactViewer_cr_disabled_message=Habilitar Repositorio Central para ver, crear y editar personas.
ContactArtifactViewer_emails_header=Correo electronico
ContactArtifactViewer_found_all_accounts_label=Se encontraron todas las cuentas.
ContactArtifactViewer_heading_Source=Fuente
# {0} - accountIdentifer
ContactArtifactViewer_id_not_found_in_cr=No se pudo encontrar la(s) cuenta(s) asociada(s) al contacto {0} en el Repositorio Central.
ContactArtifactViewer_label_datasource=Fuente de Datos
ContactArtifactViewer_label_host=Anfitrion
ContactArtifactViewer_missing_account_label=Cuenta de contacto faltante
ContactArtifactViewer_others_header=Otro
ContactArtifactViewer_persona_account_justification=Cuenta encontrada en artefacto de Contacto
ContactArtifactViewer_persona_button_new=Crear
ContactArtifactViewer_persona_button_view=Ver
ContactArtifactViewer_persona_header=Persona
ContactArtifactViewer_persona_label=Persona
ContactArtifactViewer_persona_match_num=Coincidencia
ContactArtifactViewer_persona_no_match=No se encontraron coincidencias
ContactArtifactViewer_persona_searching=Busqueda...
ContactArtifactViewer_persona_unknown=Desconocido
ContactArtifactViewer_phones_header=Telefono
DataContentViewerArtifact.failedToGetAttributes.message=No se pudieron obtener algunos o todos los atributos de la base de datos de casos
DataContentViewerArtifact.failedToGetSourcePath.message=No se pudo obtener la ruta del archivo de origen de la base de datos de casos
DefaultTableArtifactContentViewer.attrsTableHeader.sources=Fuente(s)
DefaultTableArtifactContentViewer.attrsTableHeader.type=Tipo
DefaultTableArtifactContentViewer.attrsTableHeader.value=Valor
GeneralPurposeArtifactViewer.dates.created=Creado
GeneralPurposeArtifactViewer.dates.end=Final
GeneralPurposeArtifactViewer.dates.start=Comienzo
GeneralPurposeArtifactViewer.dates.time=Tiempo
GeneralPurposeArtifactViewer.details.attrHeader=Detalles
GeneralPurposeArtifactViewer.details.bookmarkHeader=Detalles del Marcador
GeneralPurposeArtifactViewer.details.cachedHeader=Archivo en Cache
GeneralPurposeArtifactViewer.details.cookieHeader=Detalles de la Cookie
GeneralPurposeArtifactViewer.details.dataSource=Fuente de Datos
GeneralPurposeArtifactViewer.details.datesHeader=Fechas
GeneralPurposeArtifactViewer.details.downloadHeader=Archivo Descargado
GeneralPurposeArtifactViewer.details.file=Archivo
GeneralPurposeArtifactViewer.details.historyHeader=Detalles de la Visita
GeneralPurposeArtifactViewer.details.otherHeader=Otro
GeneralPurposeArtifactViewer.details.searchHeader=Busqueda en la Web
GeneralPurposeArtifactViewer.details.sourceHeader=Fuente
GeneralPurposeArtifactViewer.noFile.text=\ (ya no existe)
GeneralPurposeArtifactViewer.term.label=Termino
GeneralPurposeArtifactViewer.unknown.text=Desconocido
GeneralPurposeArtifactViewer_details_host=Anfitrion
GeneralPurposeArtifactViewer_menuitem_copy=Copiar
MessageAccountPanel.account.justification=Cuenta encontrada en artefacto de Mensaje
MessageAccountPanel_button_create_label=Crear
MessageAccountPanel_button_view_label=Ver
MessageAccountPanel_contact_label=Contacto:
MessageAccountPanel_copy_label=Copiar
# {0} - accountIdentifer
MessageAccountPanel_id_not_found_in_cr=No se pudo encontrar una cuenta con el identificador {0} en el Repositorio Central.
MessageAccountPanel_no_matches=No se encontraron coincidencias.
MessageAccountPanel_persona_label=Persona:
MessageAccountPanel_unknown_label=Desconocido
MessageArtifactViewer.AttachmentPanel.title=Adjuntos
MessageArtifactViewer.ccLabel.text=CC:
MessageArtifactViewer.rtfbodyScrollPane.TabConstraints.tabTitle=RTF
MessageArtifactViewer.toText.text=aqui va la lista para listar
MessageArtifactViewer.toLabel.text=Para:
MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML
MessageArtifactViewer.fromText.text=aqui va la direccion del remitente
MessageArtifactViewer.datetimeText.text=aqui va la fecha
MessageArtifactViewer.headersScrollPane.TabConstraints.tabTitle=Encabezados
MessageArtifactViewer.fromLabel.text=De:
MessageArtifactViewer.accountsTab.TabConstraints.tabTitle=Cuentas
MessageArtifactViewer.directionText.text=direccion
MessageArtifactViewer.subjectText.text=aqui va el asunto
MessageArtifactViewer.viewInNewWindowButton.text=Ver en Ventana Nueva
MessageArtifactViewer.subjectLabel.text=Asunto:
MessageArtifactViewer.attachmentsPanel.TabConstraints.tabTitle=Adjuntos
MessageArtifactViewer.ccText.text=aqui va la lista de cc
MessageArtifactViewer.textbodyScrollPane.TabConstraints.tabTitle=Texto
DefaultTableArtifactContentViewer.selectAllMenuItem.text=Seleccionar Todo
# Copyright 2020 Basis Technology Corp.
# 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.
DefaultTableArtifactContentViewer.copyMenuItem.text=Copiar
PersonaAccountFetcher.account.justification=Cuenta encontrada en artefacto de Registro de Llamadas
# {0} - accountIdentifer
PersonaAccountFetcher_not_account_in_cr=No se pudo encontrar una cuenta con el identificador {0} en el Repositorio Central.
# {0} - Persona count
PersonaDisplayTask_persona_count_suffix=(1 de {0})

View File

@ -0,0 +1,27 @@
ContextUsagePanel.jUsageGoToResultButton.text=Ir a Resultado
ContextSourcePanel.jSourceGoToResultButton.text=Ir a Resultado
ContextUsagePanel.jUsageTextLabel.text=Label2
ContextUsagePanel.jUsageNameLabel.text=jUsageLabel
ContextSourcePanel.jSourceTextLabel.text=Label2
ContextSourcePanel.jSourceNameLabel.text=jSourceNameLabel
ContextViewer.attachmentSource=Adjunto a:
ContextViewer.downloadedOn=En
ContextViewer.downloadSource=Descargado de:
ContextViewer.downloadURL=URL
ContextViewer.email=Correo electronico
ContextViewer.jSourceLabel.text=Uso
ContextViewer.jUsageLabel.text=Fuente
ContextViewer.jUnknownLabel.text=Desconocido
ContextViewer.message=Mensaje
ContextViewer.messageFrom=De
ContextViewer.messageOn=En
ContextViewer.messageTo=A
ContextViewer.on=Abierto a
ContextViewer.programExecution=Ejecución del Programa:
ContextViewer.recentDocs=Documentos Recientes:
ContextViewer.runOn=Ejecutado el Programa En
ContextViewer.runUnknown=\ Ejecutado el Programa en tiempo desconocido
ContextViewer.title=Contexto
ContextViewer.toolTip=Muestra contexto para el archivo seleccionado.
ContextViewer.unknown=Abierto en tiempo desconocido
ContextViewer.unknownSource=Desconocido

View File

@ -0,0 +1,21 @@
OsAccountDataPanel_administrator_title=Administrador
OsAccountDataPanel_basic_address=Direccion
OsAccountDataPanel_basic_admin=Administrador
OsAccountDataPanel_basic_creationDate=Fecha de Creacion
OsAccountDataPanel_basic_fullname=Nombre Completo
OsAccountDataPanel_basic_login=Inicio de Sesion
OsAccountDataPanel_basic_title=Propiedades Basicas
OsAccountDataPanel_basic_type=Tipo
OsAccountDataPanel_data_accessed_title=Ultimo Inicio de Sesion
OsAccountDataPanel_host_count_title=Conteo de Inicios de Sesion
# {0} - hostName
OsAccountDataPanel_host_section_title={0} Detalles
OsAccountDataPanel_realm_address=Direccion
OsAccountDataPanel_realm_confidence=Confianza
OsAccountDataPanel_realm_name=Nombre
OsAccountDataPanel_realm_scope=Alcance
OsAccountDataPanel_realm_title=Propiedades del Dominio
OsAccountDataPanel_realm_unknown=Desconocido
OsAccountViewer_title=Cuenta de Sistema Operativo
OsAccountViewer_tooltip=Visor de cuentas de Sistema Operativo relacionadas con el nodo seleccionado.
TableDataPanel.titleLabel.text=Titulo

View File

@ -0,0 +1,24 @@
StringContentPanel_Loading_String=Cargando texto...
StringsTextViewer.goToPageTextField.msgDlg=Por favor ingrese un numero de pagina valido entre 1 y {0}
StringsTextViewer.goToPageTextField.err=Numero de pagina invalido
StringsTextViewer.setDataView.errorText=(no se pudo leer el desplazamiento {0}-{1})
StringsTextViewer.setDataView.errorNoText=(el desplazamiento {0}-{1} no contiene texto)
StringsTextViewer.title=Cadenas
StringsTextViewer.toolTip=Muestra cadenas ASCII y Unicode extraidas del archivo.
StringsContentPanel.selectAllMenuItem.text=Seleccionar todo
StringsContentPanel.currentPageLabel.text_1=1
StringsContentPanel.copyMenuItem.text=Copiar
StringsContentPanel.ofLabel.text_1=de
StringsContentPanel.totalPageLabel.text_1=1000
StringsContentPanel.languageLabel.toolTipText=
StringsContentPanel.languageLabel.text=Guion:
StringsContentPanel.languageCombo.toolTipText=Idioma a intentar al interpretar (extraer y decodificar) cadenas de datos binarios
StringsContentPanel.goToPageTextField.text=
StringsContentPanel.goToPageLabel.text=Ir a la pagina:
StringsContentPanel.prevPageButton.text=
StringsContentPanel.pageLabel2.text=Pagina
StringsContentPanel.nextPageButton.text=
StringsContentPanel.pageLabel.text_1=Pagina:
TextContentViewer.title=Texto
TextContentViewer.tooltip=Muestra el texto asociado con el elemento seleccionado
TextContentViewerPanel.defaultName=Texto

View File

@ -0,0 +1,37 @@
Installer.closing.confirmationDialog.message=La ingestion esta en ejecucion, ¿estas seguro/a de que deseas salir?
Installer.closing.confirmationDialog.title=La ingestion esta en ejecucion
# {0} - exception message
Installer.closing.messageBox.caseCloseExceptionMessage=Error al cerrar el caso: {0}
OpenIDE-Module-Display-Category=Infraestructura
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=Modulo principal de Autopsy
org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml
Services/AutoupdateType/org_sleuthkit_autopsy_core_update_center.settings=Centro de actualizaciones de Autopsy
Installer.errorInitJavafx.msg=Error initializing JavaFX.
Installer.errorInitJavafx.details=\ Algunas caracteristicas no estaran disponibles. Verifica que tengas instalado JavaFX (OpenJFX 8).
ServicesMonitor.failedService.notify.title=El servicio esta caido
ServicesMonitor.failedService.notify.msg=Conexion a {0} no disponible
ServicesMonitor.restoredService.notify.title=El servicio esta activo
ServicesMonitor.restoredService.notify.msg=Conexion a {0} establecida
ServicesMonitor.statusChange.notify.title=Actualizacion del estado del servicio
ServicesMonitor.statusChange.notify.msg=El estado de {0} es {1}
ServicesMonitor.nullServiceName.excepton.txt=El nombre del servicio solicitado es nulo
ServicesMonitor.unknownServiceName.excepton.txt=El nombre del servicio solicitado {0} es desconocido
ServicesMonitor.KeywordSearchNull=No se puede encontrar el servicio de busqueda de palabras clave
ServicesMonitor.InvalidPortNumber=Numero de puerto Solr 8 no valido.
ServicesMonitor.remoteCaseDatabase.displayName.text=Servicio de base de datos de casos multiusuario
ServicesMonitor.remoteKeywordSearch.displayName.text=Servicio de busqueda de palabras clave multiusuario
ServicesMonitor.messaging.displayName.text=Servicio de mensajeria
ServicesMonitor.databaseConnectionInfo.error.msg=Error al acceder a la informacion de conexion de la base de datos de casos
ServicesMonitor.messagingService.connErr.text=Error al acceder a la informacion de conexion del servicio de mensajeria
Actions/Case=Caso
Menu/Case=Caso
Toolbars/Case=Caso
Menu/Case/OpenRecentCase=Abrir caso reciente

View File

@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
@ -385,6 +386,30 @@ public final class UserPreferences {
public static String getTimeZoneForDisplays() {
return viewPreferences.get(TIME_ZONE_FOR_DISPLAYS, TimeZone.GMT_ZONE.getID());
}
/**
* Returns the inferred preferred time zone deriving in order:
* 1) Starts with user preference if set
* 2) Gets system time zone if can be determined
* 3) Otherwise uses GMT
*
* @return Returns preferred time zone id.
*/
public static String getInferredUserTimeZone() {
String timeZonePref = viewPreferences.get(TIME_ZONE_FOR_DISPLAYS, null);
if (StringUtils.isBlank(timeZonePref)) {
ZoneId systemZoneId = ZoneId.systemDefault();
if (systemZoneId != null) {
timeZonePref = systemZoneId.getId();
}
}
if (StringUtils.isBlank(timeZonePref)) {
timeZonePref = TimeZone.GMT_ZONE.getID();
}
return timeZonePref;
}
public static void setTimeZoneForDisplays(String timeZone) {
viewPreferences.put(TIME_ZONE_FOR_DISPLAYS, timeZone);

Some files were not shown because too many files have changed in this diff Show More