mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-06 21:00:22 +00:00
Merge branch 'develop' of github.com:sleuthkit/autopsy into graphicsEnvHeadless
This commit is contained in:
commit
cdf93d7000
13
Core/ivy.xml
13
Core/ivy.xml
@ -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>
|
||||
|
@ -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" />
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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
|
@ -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
|
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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=""<html><span style=\"color: blue; text-decoration: underline\">" + DOCS_PAGE_URL + "</span></html>"" 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, "{key}")"/>
|
||||
</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>
|
@ -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
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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 `~!@#$&^*(){}[]\\\\|;'\",<>/?";
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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()
|
||||
+ '}';
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
+ '}';
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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 "";
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
@ -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
|
@ -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>
|
@ -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
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
@ -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
|
@ -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
|
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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>
|
@ -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
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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>
|
@ -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
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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>
|
@ -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
|
||||
}
|
@ -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();
|
||||
}
|
BIN
Core/src/com/basistech/df/cybertriage/autopsy/images/logo.png
Normal file
BIN
Core/src/com/basistech/df/cybertriage/autopsy/images/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
@ -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:
|
@ -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:
|
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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>
|
@ -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
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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
|
@ -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
|
File diff suppressed because it is too large
Load Diff
@ -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");
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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>
|
@ -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
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
99
Core/src/org/sleuthkit/autopsy/actions/Bundle_ar.properties
Normal file
99
Core/src/org/sleuthkit/autopsy/actions/Bundle_ar.properties
Normal 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
|
@ -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
|
@ -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?
|
@ -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
|
||||
|
@ -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
|
||||
|
483
Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ar.properties
Normal file
483
Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ar.properties
Normal 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: \\ / : * ? " < > |
|
||||
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=\
|
@ -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 {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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....
|
@ -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)
|
@ -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
|
@ -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
|
@ -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
|
@ -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.
|
@ -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
|
@ -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
|
@ -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=
|
@ -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..
|
@ -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.
|
@ -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=\
|
@ -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..
|
@ -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
|
@ -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}
|
||||
|
@ -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
|
@ -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.
|
@ -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})
|
@ -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
|
@ -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
|
@ -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
|
37
Core/src/org/sleuthkit/autopsy/core/Bundle_ar.properties
Normal file
37
Core/src/org/sleuthkit/autopsy/core/Bundle_ar.properties
Normal 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
|
@ -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;
|
||||
@ -386,6 +387,30 @@ public final class UserPreferences {
|
||||
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
Loading…
x
Reference in New Issue
Block a user